我有以下代码无法在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函数模板和显式模板特化?
答案 0 :(得分:2)
问题只是完全专业化的语法。它应该是:
template <> bool foo<bool>() { return true; }
^^^^^^
答案 1 :(得分:2)
函数模板特化(谢天谢地!)不需要返回与非专用模板相同的类型,因此这不是问题。
实际上,enable_if
与您的错误无关,您的代码只是缺少专业化中的模板参数列表:
template <>
bool foo<bool>()
{ return true; }
在旁注中,如果条件始终为真,为什么要使用enable_if
? (我想在您的真实代码中并非如此,但我只想确定:)!)