2017-09-14 37 views
13

我嘗試編譯代碼非常簡單數組:C++提供了結構初始化過程中奇怪的錯誤裏面

struct T { 
    int a[3]; 
    int b; 
    int c; 
}; 

int main() { 
    const int as[3] = { 5, 6, 7, }; 
    const T t { 
     as, 2, 3, 
    }; 
    return 0; 
} 

但它給了我很奇怪的錯誤:

t.cpp: In function 'int main()': 
t.cpp:11:5: error: array must be initialized with a brace-enclosed initializer 
    }; 
    ^

正如從我瞭解的編譯器要我在一個地方初始化所有東西。如何分別初始化字段,然後在初始化結構後使用它們?

+4

'std :: array'來拯救。 – DeiDei

+3

你不能用普通數組來做到這一點。你可以修改'T'嗎? – juanchopanza

+0

@juanchopanza我想我的代碼中只有'costs'儘可能多,並且爲了避免僅僅爲了初始化對象而發生的變異,這是我的原則。所以這裏的問題是初始化一個const對象。 –

回答

21

數組既不可複製構建也不可複製分配。如果您有權訪問C++ 11和更新版本,則可以使用std::array

#include <array> 

struct T { 
    std::array<int, 3> a; 
    int b; 
    int c; 
}; 

int main() { 
    const std::array<int,3> as = { 5, 6, 7, }; 
    const T t { 
     as, 2, 3, 
    }; 
    return 0; 
} 

否則,您將不得不滾動循環並單獨複製元素。

+5

或者你可以使用嵌套支撐初始化列表 – MikeMB

1

正如從我瞭解編譯器要我初始化一個位置的一切。

這是因爲數組類型衰變成指針類型,然後編譯器試圖指針分配給數組的類型。

如何分別初始化字段,然後在initiliazation結構中使用它們?

你可以在結構中使用指針類型(我不建議)。或者你也可以使用容器類(STL)。