1. ホーム
  2. c++

[解決済み] テンプレート引数1が無効です (Code::Blocks Win Vista) - テンプレートは使いません。

2022-02-24 07:07:02

質問

学校のプロジェクトで困っていることがあります。

授業がある

#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;}

};

そして

#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";
        }
};

コンパイルしようとすると、エラーが出ます。

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 ===|

どうしたんですか?

を追加した場合のみ、コンパイルされます。 class User; をGroup.hファイルに追加し class Group; をUser.hファイルに追加しましたが、それは重要ではありません。私は一時的なものだけでなく、正しい解決策を探しています。

私のプロジェクト全体 http://www.speedyshare.com/jXYuM/proj.tar

解決方法は?

循環的な依存関係があります。 両方のファイルは、コンパイルするためにお互いを必要とします。

グループ内のUserを前方排出してみてください。

#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(); 
};

グループ.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";
    }

    .....
 }

次に、Group.cpp ファイルで、User をインクルードします。

オブジェクトのサイズが、前宣言したオブジェクトの実際のサイズに依存しない場合は、いつでもヘッダーで前宣言することができます。 この場合、(Groupでは)Userをポインターとして使用しているので、GroupのサイズはUserのサイズに依存せず、Userのサイズに依存しないポインターを格納しているに過ぎないのです。

もうひとつ、ヘッダーファイルに名前空間(あなたの場合はstd)を含めるのは悪い習慣であるということも知っておくとよいでしょう。 using"ステートメントを削除して、代わりにstd::vectorを使用する必要があります。 他のコードがあなたのソースを "using" しないように、cpp ファイルで "using" を使用することは問題ありません。