5

私は何か間違ったことをしているようですが、何がわかりません。これが私がやろうとしていることの最小の例です:

#include <iostream>

using std::cout;

class CallMe {
 public:
  void Maybe() {
    cout << "A";
  }
};

class TemplateValue {
 public:
  static CallMe call_me;
};

template<typename T>
void CallMemberMember() {
  T::call_me.Maybe();
}

int main(int argc, char *argv[]) {
  CallMemberMember<TemplateValue>();
}

これをビルドしようとすると、リンク エラーが発生します。

$ clang++ --std=c++11 repro_link_error.cc
Undefined symbols for architecture x86_64:
  "TemplateValue::call_me", referenced from:
      void CallMemberMember<TemplateValue>() in repro_link_error-9BE9gw.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

私は何を間違っていますか?

4

3 に答える 3

8

静的メンバーの定義を提供する必要がありますcall_me

CallMe TemplateValue::call_me;
int main(int argc, char *argv[]) {
  CallMemberMember<TemplateValue>();
}
于 2013-01-02T08:39:41.360 に答える
3

これはテンプレートとは何の関係もありません。静的クラスメンバーの定義を提供する必要があります。

class TemplateValue {
 public:
  static CallMe call_me;
};

CallMe TemplateValue::call_me;

(コンパイラエラーとリンカエラーを区別する方法を学ぶ必要があります。コードは正常にコンパイルされていましたが、完全ではありませんでした。)

于 2013-01-02T08:40:51.633 に答える
0

call_mestatic として宣言しました。静的オブジェクトには、メソッドや関数と同様に定義が必要です。次のように初期化する必要があります。

CallMe TemplateValue::call_me = CallMe();
于 2013-01-02T08:42:20.620 に答える