Visual Studio 2013 - std :: enable_if警告4544

时间:2015-07-28 13:49:06

标签: c++ visual-studio c++11

我写了这段代码

标题中的课程

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>'

这是什么意思?

2 个答案:

答案 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)

默认值只能给出一次,因此如果它在标题中,则不能使用函数的定义重新设置。只需删除(或注释掉)默认值。