【问题标题】:Member function template argument default value成员函数模板参数默认值
【发布时间】:2013-02-11 12:42:54
【问题描述】:

以下代码在 GCC 4.5.3 中编译,但在 VS 2008 和 2010 中无法编译。这是由于 VS 编译器错误还是标准禁止提供默认函数模板参数值?

#include <cstdlib>

struct Bar
{
    enum Group{ A , B , C };
};

struct Foo
{
    template<typename T>
    static void getSome( typename T::Group = T::A );
};

template<typename T>
void Foo::getSome( typename T::Group )
{
};

int main()
{
    Foo::getSome<Bar>();            // Does not compile in VS 2008 & 2010 (compiles in gcc 4.5.3)
    Foo::getSome<Bar>( Bar::C );    // Compiles in VS 2008 and gcc 4.5.3
    return EXIT_SUCCESS;
}

错误信息

prog.cpp(11) : error C2589: '::' : illegal token on right side of '::'
prog.cpp(11) : error C2059: syntax error : '::'

【问题讨论】:

    标签: c++ templates function-templates default-arguments


    【解决方案1】:

    这是一个 MSVC 错误。

    问题在于处理带有默认参数的模板函数,您可能已经猜到了。

    他们的解决方法是提供所有函数参数。 (恶心)

    已确认here

    【讨论】:

    • 另一种蹩脚的选择是只为方法提供默认参数作为模板方法的重载,即提供一个额外的getSome(),它只会调用getSome(T::A)。这也适用于 MSVC。
    【解决方案2】:

    我认为g++ 在编译您的 sn-p 时遵循标准。

    以下摘录应该是对标准右侧部分的引用(第 14.1.9 节):

    默认模板参数是指定的模板参数 (14.3) 之后 = 在模板参数中。默认模板参数可能是 为任何类型的模板参数指定(类型,非类型, 模板)不是模板参数包(14.5.3)。默认 模板参数可以在模板声明中指定。一种 默认模板参数不应在 类成员定义的模板参数列表 出现在成员类之外的模板。默认 不应在朋友类模板中指定模板参数 宣言。如果友元函数模板声明指定了一个 默认模板参数,该声明应为定义和 应该是函数模板中唯一的声明 翻译单元。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-27
      • 2015-07-08
      • 1970-01-01
      • 2019-12-23
      • 1970-01-01
      • 2015-09-15
      • 1970-01-01
      • 2018-07-16
      相关资源
      最近更新 更多