簡體   English   中英

c ++模板類,initialization()vs {}

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM