[解決済み] テンプレート引数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" を使用することは問題ありません。
関連
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない
-
[解決済み】静的定数文字列(クラスメンバ)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】構造体のベクター初期化について
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない