2012-03-07 10 views
0

は、私はビルダーC++のクラスを作成し、このクラスでは、関数にテンプレート特化のC++ Builderの

static void foo(std::vector < bar* > x, int y); 

を持っているが、私はこのエラーをこのコードをコンパイルしようとすると発生します。

Undefined symbol 'bar'; Cannot generate template specialization from 'std::vector<_Ty, _Ax>'; >expected;) expected;

何が間違っていますか?

+3

? – chrisaycock

答えて

0

エラーが示すように、シンボルbarの定義はありません。

fooの宣言の前にある時点で解読する必要があります。同じファイルに含まれているか、そのファイルに含まれているヘッダーにあります。

+0

しかし 'foo'がヘッダに宣言されました。すべての宣言が正しい場合、これは私の問題です。すべての宣言が正しい場合、なぜこのエラーが発生するのですか? – adalrsjr1

+0

@ adalrsjr1:明らかに、すべての宣言が正しいわけではありません - 'foo'の前に' bar'の宣言はありません。 'bar'はどこに宣言されていますか、その宣言はどのように含まれていますか? –

+0

私は 'foo(bar x)'を宣言するとokですが、 'foo(bar * x)'宣言すると問題はありますか? – adalrsjr1

0

コンパイラは、barが何であるかわからないことを伝えています。 barはどこに定義されていますか? foo()の宣言がコンパイルされているときにまだ定義されていない場合、エラーが発生します。

テンプレートパラメータのポインタ型を使用しているので、あなたは完全に事前にbar定義することができない場合、あなたはbarのために前方宣言を使用することができ、例えば: `bar`が定義されて

class bar; // forward declaration 
static void foo(std::vector < bar* > x, int y); 
+0

'bar'はヘッダに定義されています。私はあなたが 'クラスバーを示すようにした。 static void foo(std :: vector x、int y); 'コンパイルできますが、' bar'クラスのメンバーにアクセスできません。 – adalrsjr1

+0

メンバーにアクセスするには、 'bar'のヘッダをインクルードする必要があります'foo()'の本体を実装しているソースファイル中のファイル。 –

関連する問題