sjabloonargument 1 is ongeldig (Code::Blocks Win Vista) – ik gebruik geen sjablonen

Ik heb wat problemen met mijn schoolproject.

Ik heb een les:

#include "Group.h"
#include <vector>
#include <string>
using namespace std;
class User{
    private :
        string username;
        vector<Group*> groups;
        void show() {
            for(int i=0; i<groups.size(); i++)
                cout << groups[i]->getName() << "\n";
        }
        string getUsername(){return username;}
};

en

#include "User.h"
#include <vector>
#include <string>
using namespace std;
class Group{
    private :
        string name;
        string getName(){return name;};
        User *f;
        vector<User*> m;
        void show(){
            for(int i=0; i<m.size(); i++)
                cout << m[i]->getUsername() << "\n";
        }
};

Als ik het probeer te compileren, krijg ik fouten:

E:\Group.h|31|error: ISO C++ forbids declaration of 'User' with no type| E:\Group.h|31|error: expected ';' before '*' token|
E:\Group.h|33|error: 'User' was not declared in this scope|
E:\Group.h|33|error: template argument 1 is invalid|
E:\Group.h|33|error: template argument 2 is invalid|
E:\Group.h|36|error: 'User' was not declared in this scope|
E:\Group.h|36|error: template argument 1 is invalid|
E:\Group.h|36|error: template argument 2 is invalid|
E:\Group.h|47|error: 'User' has not been declared|
E:\Group.h|47|error: 'User' was not declared in this scope|
E:\Group.h|47|error: template argument 1 is invalid|
E:\Group.h|47|error: template argument 2 is invalid|
E:\Group.h|58|error: ISO C++ forbids declaration of 'User' with no type| E:\Group.h|58|error: expected ';' before '*' token|
E:\Group.h|59|error: 'User' has not been declared|
E:\Group.h|60|error: 'User' was not declared in this scope|
E:\Group.h|60|error: template argument 1 is invalid|
E:\Group.h|60|error: template argument 2 is invalid|
E:\Group.h|61|error: 'User' was not declared in this scope|
E:\Group.h|61|error: template argument 1 is invalid|
E:\Group.h|61|error: template argument 2 is invalid| ||=== Build finished: 21 errors, 4 warnings ===|

wat is er aan de hand?

Het compileert alleen als ik class User;toevoeg aan Group.h-bestand, en class Group;aan User.h-bestand, maar het is niet het punt waar ik naar op zoek ben voor de juiste oplossing, niet alleen de tijdelijke.

MIJN HELE PROJECT:http://www.speedyshare. com/jXYuM/proj.tar


Antwoord 1, autoriteit 100%

Je hebt een cyclische afhankelijkheid. Beide bestanden hebben elkaar nodig om te compileren.

Probeer gebruiker in groep door te geven:

#include <vector>
#include <string>
class User;
class Group{
    private :
        std::string name;
        std::string getName(){return name;};
        User *f;
        std::vector<User*> m;
        void show(); 
};

Groep.cpp

#include "Group.h"
#include "User.h"
using namespace std;
class Group
{
    .....
    void show() {
        for(int i=0; i<m.size(); i++)
        cout << m[i]->getUsername() << "\n";
    }
    .....
 }

Voeg vervolgens Gebruiker toe aan het bestand Group.cpp.

Je kunt in de header altijd declareren als de objectgrootte niet afhangt van de werkelijke grootte van het object dat je forward declareert. In dit geval (in Groep) gebruik je Gebruiker als een aanwijzer en daarom is de grootte van de Groep niet afhankelijk van de grootte van de Gebruiker, het slaat alleen een aanwijzer op die onafhankelijk is van de Gebruikersgrootte.

Een ander weetje dat zou moeten helpen, is dat het een slechte gewoonte is om naamruimten (in jouw geval std) in een headerbestand op te nemen. U moet de instructie “using” verwijderen en in plaats daarvan std::vector uitvoeren. Het gebruik van een “using” in het cpp-bestand is prima, omdat andere code uw bron niet “bevat”.


Antwoord 2, autoriteit 25%

Je hebt een cyclische afhankelijkheid in de headers. U kunt het oplossen door de implementaties naar .cpp-bestanden te verplaatsen en de klassen die u gebruikt verder te declareren:

#include <vector>
#include <string>
class Group; // forward declaration
class User{
    private :
        std::string username;
        std::vector<Group*> groups;
        void show();
};

en

#include <vector>
#include <string>
class User; // forward declaration
class Group{
    private :
        std::string name;
        std::string getName(){return name;};
        User *f;
        std::vector<User*> m;
        void show();
};

Vervolgens kunt u in uw implementatiebestanden de koppen opnemen.

Houd er ook rekening mee dat u het gebruik van using namespace stdin headers en in grote bereiken moet vermijden.


Antwoord 3, autoriteit 12%

U gebruiktsjablonen. Je gebruikt vector, wat een sjabloon is.

Je krijgt de foutmelding die je krijgt omdat de klasse User niet is gedefinieerd wanneer je het volgende deel van de code bereikt:

User *f;
vector<User*> m;

Waarom is het niet gedefinieerd – u neemt tenslotte de User.h-header op? Ja, maar de User.h-header bevat ook de Group.h-header, dus een van de twee moet voor de andere worden gelezen.

Om dit op te lossen, moet je je koppen wijzigen, zodat slechts een van de koppen de andere bevat (of beide niet de andere). Om dit te doen, moet u eerst uw methodedefinities naar een c++-bestand verplaatsen, zodat er geen methodeaanroepen naar de methode van de andere klasse in de koptekst verschijnen. Dan kun je de andere klasse forward-declareren en de #include verwijderen.

Other episodes