1

プログラムで次の構造体を使用しています。

struct terminator{
    int id;
    string type;
    union{
        terminator *next;
        int empty;
    };
};

主に私は次のコードを持っています:

int main(){
    terminator root = {0, "", NULL};
    root = {0, "", NULL}; //NOT ALLOWED WHY? Trying to set to its original value.
}

これにより、次のエラーメッセージが表示されます。

g++ lab8.cc -std=c++11
lab8.cc: In function 'int main()':
lab8.cc:78:21: error: no match for 'operator=' in 'root = {0, "", 0}'
lab8.cc:78:21: note: candidates are:
lab8.cc:6:8: note: terminator& terminator::operator=(const terminator&)
lab8.cc:6:8: note:   no known conversion for argument 1 from '<brace-enclosed in
itializer list>' to 'const terminator&'
lab8.cc:6:8: note: terminator& terminator::operator=(terminator&&)
lab8.cc:6:8: note:   no known conversion for argument 1 from '<brace-enclosed in
itializer list>' to 'terminator&&'

しかし、これは代わりに大丈夫です:

int main(){
    terminator root = {0, "", NULL};
    root = *(new terminator);
    root.id=0;
    root.type="";
    root.next=NULL;
}

なんでそうなの?それを回避する方法はありますか?

4

3 に答える 3

3

最初のケースでは、構造を初期化しています。

2番目のケースでは、すでに宣言されている変数に割り当てようとしていますが、コンパイラが拡張として複合リテラルをサポートしていない限り、それは機能しません。(たとえそうだとしても、あなたは書く必要があるでしょう

root = (terminator){ 0, "", NULL };

実際に機能させるためです。)

C ++ 11を使用できる場合(使用しているようです)、同様の構文を持つ「初期化リスト」と呼ばれる新機能を利用することもできます。

root = terminator{ 0, "", NULL };
于 2013-03-19T09:03:15.907 に答える
2

terminatorRHSのタイプが次のとおりであることをコンパイラーに通知する必要があります。

root = terminator{0, "", NULL};
于 2013-03-19T09:02:45.397 に答える
1

この行terminator root = {0, "", NULL};は、コンストラクターがない場合に許可される構築の形式である集約初期化を実行します。そこ=には実際には割り当てを意味するものではありません。C ++ 11では、中括弧構文を使用して、タイプの匿名の一時オブジェクトを作成terminatorできます。これを次のように割り当てることができますroot

root = terminator{0, "", nullptr};
于 2013-03-19T09:04:06.433 に答える