3

このエラーを解決するにはどうすればよいですか?

私のヘッダーファイル

template<typename T>
class C1 {
public:
typedef std::vector<T::F> TFV;
TFV Function1();
};

私のCPPファイル

template<typename T>
TFV C1::Function() //error: ‘TFV’ does not name a type
{ }
4

2 に答える 2

14

まず、キーワードを使用して、型の (修飾された) 名前としてtypename解釈するようにコンパイラに指示します。F

typedef std::vector<typename T::F> TFV;
//                  ^^^^^^^^

次に、TFVはグローバル名前空間で定義された型ではないため、 の定義でも適切に修飾する必要がありますFunction1()

    template<typename T>
    typename C1<T>::TFV C1<T>::Function1()
//  ^^^^^^^^ ^^^^^^^      ^^^
    { }

最後に、クラス テンプレートのメンバー関数の定義は、ヘッダー ファイルに配置する必要があります。ただし、そうしないと暗黙的に生成されるすべてのテンプレートのインスタンス化に対して明示的なインスタンス化を提供する場合を除きます。

そうしないと、リンカーから未解決の参照エラーが発生する可能性が高くなります。

于 2013-02-26T21:40:53.167 に答える
7

C++11 をお持ちですか? 次に、末尾の戻り値の型を使用します。

template<typename T>
class C1 {
public:
  typedef std::vector<typename T::F> TFV;
  TFV Function1();
};

template<typename T>
auto C1<T>::Function1() -> TFV { }

この場合、関数のパラメーターの後、スコープはブロック()内と同じであるため、これは機能します。(decltype と組み合わせると便利) に{}アクセスでき、スコープ解決演算子なしで使用できます。thisTFV

于 2013-02-26T21:42:01.883 に答える