7

テンプレートクラスを使用しようとしていますが、LWSで1つのファイルにコンパイルすると、次のように機能します。

(リンクは無効です)〜http://liveworkspace.org/code/a9c412a7e683439dfa35a9363749369d〜

しかし、3つのファイルで構成されたコンパイルを試みると、

stack.hの4行目から21行目

stack.cppの24〜48行目

main.cppの49行目から最後まで

これらの3つのファイルをコンパイルしようとすると、

Undefined symbols for architecture x86_64:
  "Stack2<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::push(Node**, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)", referenced from:
      _main in ccCoizCT.o
  "Stack2<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::top(Node*&)", referenced from:
      _main in ccCoizCT.o
  "Stack2<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::pop(Node*&)", referenced from:
      _main in ccCoizCT.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

はい、stack.cppファイルとmain.cppファイルにstack.hを含めました

4

1 に答える 1

12

スタックのテンプレート定義をヘッダーファイルに戻す必要があるようです。テンプレートはコード生成の計画を形成するため、コンパイラーがテンプレート定義全体を表示できず、宣言のみを表示する場合、テンプレートの特定のインスタンス化のコードは生成されません。単に宣言を信頼し、リンク時にそれらのテンプレートのインスタンス化を含むオブジェクトファイルが存在することを期待します。これに対する解決策は、1)ヘッダーファイルにテンプレート定義を保持するか、2)リンカがリンク時にそれらを見つけられるように、必要な定義を事前に生成することです。

ここを参照してください: テンプレートの問題によりリンカーエラーが発生します(C ++)

于 2012-10-15T23:31:29.130 に答える