C++-不能将默认参数添加到类模板成员的越界定义中

C++ - Default arguments cannot be added to an out-of-line definition of a member of a class template

本文关键字:成员 越界 定义 不能 默认 参数 添加 C++-      更新时间:2023-10-16

我有一个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_;
}

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

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)
    {
    }
};

根据标准(N3797)§8.3.6/6默认参数[dcl.fct.Default](emphasis mine):

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

上面的意思是模板类的成员函数的默认参数只在类的定义中。因此,您将在成员函数的声明中放入默认参数:

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) {
    ...
  }
  ...
};