C ++ - 无法将默认参数添加到类模板成员的外联定义中

时间:2014-09-03 14:40:08

标签: c++ ios openframeworks

我有一个iOS应用程序,它使用MPL的一个名为'square.h'的C ++类,每当我构建应用程序时Xcode都会抛出此错误 -

无法将默认参数添加到类模板成员的外联定义

现在,我对C ++语法的理解很少,那么这个错误意味着什么?

有问题的行在下面 -

template <class T> 
TSquare<T>::TSquare (T size_, T x_, T y_, T scale_=0)
{
    size = size_;
    x = x_;
    y = y_;
    scale = scale_;
}

2 个答案:

答案 0 :(得分:13)

默认参数不是定义的一部分,只是声明:

template <class T>
class TSquare
{
public:
    TSquare (T size_, T x_, T y_, T scale_ = 0);
};

// out-of-line definition of a member of a class template:
template <class T>
TSquare<T>::TSquare (T size_, T x_, T y_, T scale_ /* = 0 */)
{

}

或:

template <class T>
class TSquare
{
public:
    // in-line definition of a member of a class template
    TSquare (T size_, T x_, T y_, T scale_ = 0)
    {

    }
};

答案 1 :(得分:5)

根据标准(N3797§8.3.6/ 6默认参数[dcl.fct.default](强调我的):

  

除了类模板的成员函数外,成员函数定义中的默认参数   出现在类定义之外的内容被添加到成员提供的默认参数集中   类定义中的函数声明。 类模板的成员函数的默认参数   应在类模板中的成员函数的初始声明中指定。

上述意味着模板类的成员函数的默认参数仅在类的定义内部。因此,您将在成员函数的声明中输入默认参数:

template<T>
class TSquare {
  ...
  TSquare (T size_, T x_, T y_, T scale_ = 0);
  ...
};

或者你应该将成员函数的整个定义放在类定义中。

template<T>
class TSquare {
  ...
  TSquare (T size_, T x_, T y_, T scale_ = 0) {
    ...
  }
  ...
};