ここにテンプレートに関する質問:欠落している型名!
template <typename T>
class vector
{
public:
typedef T * iterator;
...
};
template <typename T>
void func()
{
vector<T>::iterator it; // this is not correct!
typename vector<T>::iterator it2; // this is correct.
}
ここでの問題は、vector<T>::iterator
が依存名であるということである:それはテンプレートパラメータに依存します。結果として、コンパイラはiterator
が型を指定することを知らない。我々は彼にtypename
キーワードで伝える必要があります。
テンプレートの内部クラスまたはテンプレートメンバー/静的関数についても同じことが言えます.Opt31に記載されているように、template
キーワードを使用して曖昧さを除去する必要があります。
template <typename T>
void func()
{
T::staticTemplateFunc<int>(); // ambiguous
T::template staticTemplateFunc<int>(); // ok
T t;
t.memberTemplateFunc<int>(); // ambiguous
t.template memberTemplateFunc<int>(); // ok
}
Btwの場合は、テンプレートgotchasに限定したいと思うかもしれません。一般的なC++のgotchasについてもう一つの質問があります。 – int3
'template bar();'にはどのような戻り値がありますか? –
xtofl
あなたはあなたの前提に間違いがあります。 'f'は従属名ではないので、ここで' template'は必要ありません。とにかくそれは何に依存するでしょうか?これは、 'Foo'型のオブジェクトに対して、不特定のスコープ内の名前です。 –
MSalters