Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;模板类,初始化()与{}_C++_Templates_C++11 - Fatal编程技术网

C++ c++;模板类,初始化()与{}

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] =

我想知道为什么我不能在另一个类(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] = 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使得解析时很难确定某个内容是函数声明还是初始值设定项。