我有一个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_;
}
答案 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) {
...
}
...
};