1

VC2010でコンパイルできない次のコードがあります。

#include <type_traits>

using namespace std;

template <class C>
typename enable_if<true, C>::type
foo()
{ return C(); }

template <>
bool
foo()
{ return true; } // error C2785: 'enable_if<true,_Type>::type foo(void)' 
                 // and 'bool foo(void)' have different return types

int main()
{
    auto a = foo<int>();
    auto b = foo<bool>();
}

foo()の最初のバージョンは機能的に同じでtemplate <class C> C foo();あり、正常にコンパイルされるため、エラーメッセージは誤っているようです。

enable-if'd関数テンプレートと明示的なテンプレートの特殊化を組み合わせて使用​​する方法はありますか?

4

2 に答える 2

2

問題は、完全な特殊化の構文にすぎません。そのはず:

template <> bool foo<bool>() { return true; }
                    ^^^^^^
于 2011-09-29T12:57:07.493 に答える
2

関数テンプレートの特殊化は、(ありがたいことに!)特殊化されていないテンプレートと同じ型を返す必要がないため、ここでは問題になりません。

実際、enable_ifエラーとは何の関係もありません。コードには、スペシャライゼーションのテンプレート引数リストがありません。

template <>
bool foo<bool>()
{ return true; }

enable_ifちなみに、条件が常に真であるのに、なぜ使用しているのですか?(これは実際のコードには当てはまらないと思いますが、確認したいのですが:)!)

于 2011-09-29T12:57:15.380 に答える