6

どこで使用するかを理解しようとしてtemplatetypenameますが、回避できない問題に遭遇しました。f<T>渡された型 (クラスになります) を使用して template-member-function を呼び出す template-function があります.f<T>。関数本体での使用は正しいと思いますtypenameが、次のエラーが引き続き発生します。

source.cpp: 関数内'void f()':
source.cpp:11:19: エラー: 非テンプレートがテンプレート'f'として使用されました
source.cpp:11:19: 注:'typename T::C::template f'テンプレートであることを示すために使用します

struct A {
  struct C {
     template <typename T> void f() {}
  };
};

template <typename T> void f() {

  typename T::C::f<int>();

}

int main() {

  f<A>();

}

最後のエラーで、'typename T::C::template f'代わりに使用することをお勧めします。そのため、それに応じて次の変更を行いました。

// ...
typename T::C::template f<int>();
// ...

言われたとおりにしましたが、次のエラー行を受け取りました。

エラー: で名前が付けられたクラス テンプレートがありませ'f''struct A::C'

inという名前の public テンプレート関数が実際存在するという点で、このエラーは正しくないと思います。ここで何が間違っているのでしょうか?fstruct A::C

4

1 に答える 1

7

f staticインスタンスなしで呼び出すことができるように作成すると仮定するtypenameと、依存型であいまいさを作成していないため必要ありません (つまり、直後にC使用するため、変数にすることはできません)。::正しい構文は次のとおりです。

struct A {
  struct C {
     template <typename T>
     static void f() {}
  };
};

template <typename T> void f() {
  T::C::template f<int>();
}

静的にしたくない場合は、を作成しA::Cて使用します.template f<int>()

struct A {
  struct C {
     template <typename T>
     static void f() {}
  };
};

template <typename T> void f() {
  typename T::C c;
//^^^^^^^^ Now we DO need typename to disambiguate.

  c.template f<int>();
}
于 2012-10-18T16:27:35.727 に答える