次のコードがあります。
template <typename T>
void f1( T t )
{
std::cout << "f1( " << t << " ) called." << endl;
}
template <typename T>
void f2( T t )
{
std::cout << "f2( " << t << " ) called." << endl;
}
template <typename F, typename T>
void call( F && f, T t )
{
f( t );
}
template <typename T>
void foo( T t )
{
call( f1<T>, t ); // Why is <T> necessary?
// f1(t) is a valid expression!
call( f2<T>, t );
}
void bar()
{
foo( 1 );
}
関数では、有効な式ですがfoo()
、テンプレート引数を指定する必要があります。f1(t)
それは私のコードのいくつかの可能性を破壊しています。私の質問:
- テンプレート引数を指定する必要があるのはなぜですか?
- その制限を回避するにはどうすればよいですか? (C++11 または C++14 が許可されます)。
(ところで: 現在 Visual Studio 2010 を使用していますが、省略した場合、エラー C2896 が表示<T>
されます。)