[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
2022-01-21 17:55:48
質問
学校のプロジェクトで困っていることがあります。
授業がある
#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" を使用することは問題ありません。
関連
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み] 配列のベクトルを扱う正しい方法
-
[解決済み】静的定数文字列(クラスメンバ)
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?