Sjabloon- en vectorfouten

I dont know what im doing wrong this is my first time seperating .cpp files and using templates and vectors. I keep getting these two errors: error C2143: syntax error : missing ',' before '<' and error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

main.cpp

#include 
#include 
using namespace std;

template 
void write_vector(const vector& V);

int main()
{
    int n;
    int value;
    vector V;
    cout << "Enter n: ";
    cin >> n;
    cout << "Enter " << n << " integer values: ";
    while(V.size() < n && cin >> value){
        V.push_back(value);
    }

    write_vector(V);

    return 0;
}

writeVector.cpp

template 
void write_vector(const vector &V)
{
    for(int i=0; i < V.size(); i++)
        cout << V[i] << " ";
}
0
Waar neem je writeVector.cpp aan toe? - Het moet uiteindelijk worden opgenomen in main.cpp, omdat sjablonen niet afzonderlijk kunnen worden gecompileerd naar het objectbestand. Op welke regels ontvangt u uw fouten?
toegevoegd de auteur dimba, de bron
Welke lijn is de fout?
toegevoegd de auteur Gene Bushuyev, de bron
gebruik je # write of expliciet de functie? je vraag mist details.
toegevoegd de auteur Gene Bushuyev, de bron

6 antwoord

Uw sjabloonfunctie moet van tevoren worden gedefinieerd, zodat de compiler deze kan gebruiken. Definieer het voor main() in het enkele bestand of # include het in een headerbestand.

In summary, template functions should be defined in header files. See the answer to Why can templates only be implemented in the header file?

3
toegevoegd
De compiler weet alleen dat er een sjabloontype bestaat. U moet de definitie naar een headerbestand verplaatsen en # include it before main of copy it above main.
toegevoegd de auteur koan, de bron
is mijn template niet gedefinieerd voor main?
toegevoegd de auteur Sean, de bron

Hiervoor hebt u expliciete instantiatie nodig omdat de compiler niet weet voor welke typen de sjabloon moet worden gecompileerd voor het compileren van de .cpp. Zie Expliciete instantiatie - wanneer wordt deze gebruikt? .

3
toegevoegd
Dus hoe zouden mijn .h- en .cpp-bestanden eruit zien.
toegevoegd de auteur Sean, de bron

Voor zover ik me herinner, kun je de verklaring en implementatie van een sjabloon niet scheiden.

1
toegevoegd

Op de top van main.cpp toevoegen:

#include "Vector.cpp"//since you are learning, this is really strange and should be avoided, but for your example we leave it as is.

In your Vector.cpp

#include 
#include 

template
void write_vector(const std::vector& V)
{
    for(int i=0; i < V.size(); i++)
        std::cout << V[i] << " ";
}

Gebruik geen verklaringen gebruiken. Slechte gewoonte. U hebt geen expliciete instantiatie of andere dingen nodig. Uw compiler kan de juiste sjabloon aftrekken.

Altough this works, it's bad code. When using template always write everything in the .h file. So change your Vector.cpp to Vector.h. Remove the forward declaration from your main.cpp and #include "Vector.cpp"

Uw code werkt prima zonder andere wijzigingen.

Uiteindelijk zou de C ++ manier om dingen te doen b.v. :

#include 
#include 
#include 

template
void write_vector(const std::vector& V)
{
    std::copy(V.begin(), V.end(), std::ostream_iterator(std::cout, " "));//you don't even need this function right?
    //for(int i=0; i < V.size(); i++)
//      std::cout << V[i] << " ";
}

Je kunt soortgelijke dingen doen voor de cin.

0
toegevoegd

U hebt in beide bestanden de include s en met nodig. Op dat moment hebt u wellicht de expliciete instantiatie nodig die wordt vermeld in andere antwoorden, maar deze worden weergegeven als verbindingsproblemen.

0
toegevoegd

write_vector needs to be in a header file (writeVector.h) rather than a .cpp file if you want to share it between different modules. For more information about why you need to do this see the C++ FAQ.

Ik neem aan dat uw syntaxisfout is omdat u een ontbrekende gebruikt met naamruimte std; in writeVector.cpp? Wanneer u het naar een headerbestand verplaatst, moet u dit hier niet met behulp van de instructie plaatsen, omdat dat de global namespace nodeloos vervuilt wanneer dit bestand wordt opgenomen. In plaats daarvan moet u alle verwijzingen naar vector expliciet kwalificeren als std :: vector .

0
toegevoegd