【问题标题】:C++ templates, vector.size used in default parameter definitoinC++ 模板,vector.size 用于默认参数定义
【发布时间】:2012-02-10 11:52:24
【问题描述】:

有一个结构TA

template <typename T>
struct TA
{
    typedef std::vector <T> Type;
};

和 test() 函数具有 TA 类型的默认参数。

template <typename T>
void test ( typename TA<T>::Type a1, 
            typename TA<T>::Type a2 = typename TA<T>::Type(a1.size()) )
{}

是否可以在默认参数a2定义中使用a1.size()?

int main()
{
    TA <double> ::Type a1;
    test<double>(a1);
}

【问题讨论】:

标签: c++ templates parameters default definition


【解决方案1】:

是否可以在默认参数a2定义中使用a1.size()?

没有。标准是禁止的。不能使用函数参数来设置其他参数的默认值。

§8.3.6/9 (C++03) 明确表示,

每个默认参数都被评估 调用函数的时间。 订单 函数参数的评估是 未指定因此,参数 的函数不得用于 默认参数表达式,即使 他们没有被评估。

所以解决方法是:使用重载:

template <typename T>
void test(typename TAs<T>::Type a)
{
    test(a, typename TA<T>::Type(a.size()));
}

【讨论】:

    【解决方案2】:

    没有。一般来说,函数参数不能在函数体之外使用,特别是不能在另一个参数的默认值中使用。

    你可以通过重载得到同样的效果:

    template <typename T>
    void test ( typename TAs<T>::Type a1, typename TA<T>::Type a2);
    
    template <typename T>
    void test ( typename TAs<T>::Type a1)
    {
        test(a1, typename TA<T>::Type(a1.size()));
    }
    

    【讨论】:

      猜你喜欢
      • 2012-12-21
      • 2015-05-09
      • 2012-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-28
      • 1970-01-01
      相关资源
      最近更新 更多