C++ c++;模板类,初始化()与{}
我想知道为什么我不能在另一个类(C++11)的范围内用()而不是{}初始化以下模板类的实例?错误:数字常量前应有标识符C++ c++;模板类,初始化()与{},c++,templates,c++11,C++,Templates,C++11,我想知道为什么我不能在另一个类(C++11)的范围内用()而不是{}初始化以下模板类的实例?错误:数字常量前应有标识符 template <typename T> class vec3 { private: T data[3]; public: vec3 (T a, T b, T c); }; template <typename T> vec3<T>::vec3 (T a, T b, T c) { data[0] =
template <typename T>
class vec3 {
private:
T data[3];
public:
vec3 (T a, T b, T c);
};
template <typename T>
vec3<T>::vec3 (T a, T b, T c)
{
data[0] = a;
data[1] = b;
data[2] = c;
}
class whatever {
vec3 <float> a (1,2,3); // not ok
vec3 <float> b {1,2,3}; // ok
};
int main () {
vec3 <float> a (1,2,3); // ok
return 0;
}
模板
vec3类{
私人:
T数据[3];
公众:
vec3(ta,tb,tc);
};
模板
vec3::vec3(ta,tb,tc)
{
数据[0]=a;
数据[1]=b;
数据[2]=c;
}
什么课都行{
vec3a(1,2,3);//不正常
vec3b{1,2,3};//好的
};
int main(){
vec3a(1,2,3);//好的
返回0;
}
这只是对如何初始化类成员的限制。您可以使用{}
或=
,但不能使用()
我不认为这项限制有什么特别令人信服的理由;这只是该语言的许多怪癖之一。使用()
的初始值设定项在中被禁止,原因是@T.C.在评论部分提到:
不幸的是,这使得“(
表达式列表)
的初始值设定项
解析声明时表单不明确:
struct S {
int i(x); // data member with initializer
// ...
static int x;
};
struct T {
int i(x); // member function declaration
// ...
typedef int x;
};
一种可能的解决方案是依赖现有规则,即如果声明可以是对象或函数,那么它就是函数:
struct S {
int i(j); // ill-formed...parsed as a member function,
// type j looked up but not found
// ...
static int j;
};
一个类似的解决方案是应用另一个现有规则,目前只在模板中使用,如果T可以是一个类型或
其他的东西,那么它就是其他的东西;我们可以使用“typename”如果
我们指的是一种类型:
struct S {
int i(x); // unabmiguously a data member
int j(typename y); // unabmiguously a member function
};
这两种解决方案都引入了一些可能被许多用户误解的微妙之处(如网站上的许多问题所示)
COMP.Lang.c++关于在块作用域中为什么“<代码> int());< /代码>不声明
默认已初始化int
)。本文提出的解决方案是只允许“=
初始值设定项子句”和“{
初始值设定项列表}
”表单的初始值设定项。
在类内部使用时,它不是被视为函数减速吗?@NathanOliver:只有当
()
中的内容可以解释为函数参数时;在这种情况下,无论它出现在哪里,它都是一个函数声明。原因是委员会希望NSDMIs获得类范围查找,就像构造函数中的成员初始值设定项列表一样,但类范围查找允许()
form使得解析时很难确定某个内容是函数声明还是初始值设定项。