次のコードを検討してください。
struct Test {
template <int S>
bool call();
};
template <>
bool Test::call<0>() {
return false;
}
template <>
bool Test::call<1>() {
return true;
}
template <int S, typename T>
static void func(T& t) {
t.call<S>();
}
int main()
{
Test t;
func<0>(t);
}
コンパイルエラーが発生しました:
a.cpp: In function ‘void func(T&)’:
a.cpp:19:15: error: expected primary-expression before ‘)’ token
a.cpp: In instantiation of ‘void func(T&) [with int S = 0; T = Test]’:
a.cpp:25:14: required from here
a.cpp:19:5: error: invalid operands of types ‘<unresolved overloaded function type>’ and ‘int’ to binary ‘operator<’
t.call<0>()
またはt.call<1>()
をmain()
関数に入れると、正常に動作します。このコードでテンプレート引数の推定が機能しない理由を誰か教えてもらえますか? この場合、部分的に特殊化されたテンプレート メンバー関数を使用して型を渡すことが機能しない理由がわかりません。