我写了这段代码
标题中的课程
template <typename T,
typename = typename std::enable_if<std::is_arithmetic<T>::value, T>::type>
T GetResultValueAsNumber(char * result);
比内联文件
template <
typename T,
typename = typename std::enable_if<std::is_arithmetic<T>::value, T>::type
>
T PostgreSQLWrapper::GetResultValueAsNumber(char * result)
{
double value = strtod(result, NULL);
return static_cast<T>(value);
};
在Visual Studio 2013中,我收到此警告(但代码正常)
warning C4544: '<unnamed-symbol>' : default template argument ignored on this template declaration - see declaration of '<unnamed-symbol>'
这是什么意思?
答案 0 :(得分:3)
VC ++不符合这里;该计划格式不正确。 GCC和Clang refuse to compile similar code。
§14.1/ 10:
获取可供使用的默认模板参数的集合 通过合并来自所有先前声明的默认参数 模板与默认函数参数的方式相同(8.3.6)。
§8.3.6/ 4:
默认参数不能由后来的声明重新定义(不是 即使是相同的值)。
/ 6也显示了一个例子:
除了类模板的成员函数,默认参数 在出现在类外部的成员函数定义中 定义被添加到由。提供的默认参数集中 类定义中的成员函数声明; [...] [示例:
class C { void f(int i = 3); }; void C::f(int i = 3) { // error: default argument already } // specified in class scope // […]
- 结束示例]
答案 1 :(得分:1)
默认值只能给出一次,因此如果它在标题中,则不能使用函数的定义重新设置。只需删除(或注释掉)默认值。