[英]c++ template class, initialization () vs {}
我想知道為什么我不能在另一個類(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;
}
這只是對如何初始化班級成員的限制。 您可以使用{}
或=
但不能使用()
。
我認為限制沒有特別令人信服的理由; 這只是語言中很多怪癖之一。
由於@TC在評論部分中提到的原因, 在非靜態數據成員初始化程序-N2756的提議中不允許使用()
初始化程序 :
不幸的是,這使得“
(
表達式列表)
”的初始化器在解析聲明時形式不明確: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 i();
”在塊范圍內沒有聲明默認初始化的int
) 。 本文提出的解決方案是僅允許“=
initializer-clause ”和“{
initializer-list}
”形式的初始化器 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.