簡単な例を使って、使い方を理解しようとしていますstd::enable_if
。この回答を読んだ後、簡単な例を考え出すのはそれほど難しくないと思いました。std::enable_if
2つのメンバー関数から選択して、そのうちの1つだけを使用できるようにしたい。
残念ながら、以下はgcc 4.7でコンパイルできません。何時間も試行した後、私の間違いは何ですかと皆さんに尋ねています。
#include <utility>
#include <iostream>
template< class T >
class Y {
public:
template < typename = typename std::enable_if< true >::type >
T foo() {
return 10;
}
template < typename = typename std::enable_if< false >::type >
T foo() {
return 10;
}
};
int main() {
Y< double > y;
std::cout << y.foo() << std::endl;
}
gccは次の問題を報告します。
% LANG=C make CXXFLAGS="-std=c++0x" enable_if
g++ -std=c++0x enable_if.cpp -o enable_if
enable_if.cpp:12:65: error: `type' in `struct std::enable_if<false>' does not name a type
enable_if.cpp:13:15: error: `template<class T> template<class> T Y::foo()' cannot be overloaded
enable_if.cpp:9:15: error: with `template<class T> template<class> T Y::foo()'
g ++が2番目のメンバー関数の間違ったインスタンス化を削除しないのはなぜですか?規格によると、std::enable_if< bool, T = void >::type
ブールテンプレートパラメータがtrueの場合にのみ存在します。しかし、なぜg ++はこれをSFINAEと見なさないのですか?オーバーロードのエラーメッセージは、g ++が2番目のメンバー関数を削除しないという問題から発生し、これがオーバーロードであると考えていると思います。
std::is_same< T, int >::value
と! std::is_same< T, int >::value
され、同じ結果が得られます。