次の例をコンパイルする際に奇妙な問題があります。私はfoo<short>(0)
を呼び出すときに、foo<int>(0)
コンパイルを呼び出しますが、0のテンプレート関数のあいまいなパラメータの控除
template<typename T>
struct identity {
typedef T type;
};
template<typename T>
void foo(typename identity<T>::type v) {}
template<typename T>
void foo(typename identity<T>::type* v) {}
int main() {
foo<int>(0);
foo<short>(0);
return 0;
}
0が値またはポインタである場合、コンパイラは推測することはできません。私は、アイデンティティを使用してテンプレートパラメータの明示的な指定を強制します。コンパイラ(msvc)エラーメッセージ:
error C2668: 'foo': ambiguous call to overloaded function
コンパイラのバグですか?