3

次のコードスニペットがありますが、機能しません。dataMapメンバーには、T&とTを使用して適切なタイミングでコールバックに渡すコールバック関数が含まれている必要があります。テンプレートメンバーの初期化は、次の場合に失敗します(g ++ 4.7.2の場合)error: need ‘typename’ before ‘MyClass<T>::DataMap’ because ‘MyClass<T>’ is a dependent scope。typenameを表示されている場所に貼り付けようとしましたが、別のエラーが発生しましたerror: expected primary-expression before ‘;’ token。この方法でそれを行うことは可能ですか、それとも初期化からtypedefを削除する必要がありますか?私はその道を進んでみましたが、すぐに判読できなくなり、さらに多くのエラーが発生しました。

template <typename T> class MyClass
{
public:
  typedef void(*CallbackType)(T&);
  typedef std::unordered_map<int, std::pair<T, CallbackType>/**/> DataMap;
  static DataMap dataMap;
  ...
};

template <typename T> MyClass<T>::DataMap MyClass<T>::dataMap = MyClass<T>::DataMap;
4

1 に答える 1

7

は修飾された従属名であるtypenameため、コンパイラはキーワードを含めることを正しく提案しています。静的メンバー定義は次のようになります。DataMapMyClass<T>::DataMap

template <typename T>
typename MyClass<T>::DataMap MyClass<T>::dataMap;

メンバーはデフォルトで構築されるため、コピーして初期化する必要はありません。したがって、この部分を省略するだけで十分です(コピー初期化の右側に= MyClass<T>::DataMapある括弧を忘れたために問題が発生します)。DataMap

// This is also valid (mind the parentheses to invoke the
// constructor of `DataMap`), but unnecessary.
template <typename T>
typename MyClass<T>::DataMap MyClass<T>::dataMap = MyClass<T>::DataMap();
于 2013-02-13T21:41:14.323 に答える