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();愉快地编译的相同。

有没有办法混合匹配启用的功能模板和显式模板专业化?

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 回答