1

私はクラスの編曲のための代入演算子をオーバーロードしていますから、コンストラクタを呼び出します。これは、デストラクタを使用して古いオブジェクトを削除し(割り当てられたメモリを解放する)、呼び出し元オブジェクトをrhsのコピーにするためにコピーコンストラクタ(以前はオーバーロードされています)を使用して実装されます。 this写真はこれを行う2つの異なる方法を示しています(50行と57行だけが異なります)。なぜ2番目のソリューションは機能しますか?何が間違ってここに行く:代入演算子

エラーメッセージが

Arr& Arr::operator=(const Arr& rhs) { 
    this->~Arr(); 
    this->Arr(rhs); // I get an error here: type name is not allowed 
    return (*this); 
} 


Arr& Arr::operator=(const Arr& rhs) { 
    this->~Arr(); 
    this->Arr::Arr(rhs); 
    return (*this); 
} 

は、私はコピーおよびスワップを使用することが可能である知っているが、それでも「タイプ名が許可されていない」のですか?

+2

このコードは、例外安全ではありません、あなたがスワップについて知っている場合は、なぜあなたは、このような質問をするのでしょうか?なぜあなたはそのような悪いコードを書いていますか?あなたのコードの問題は、コンストラクタを明示的に呼び出すことは不正です。すでに割り当てられたメモリ上でコンストラクタを呼び出す唯一の方法は、新しい配置を使用することです(少なくともC++ 03では)。あなたのコンパイラで2番目の構文が動作する場合は、それが標準であるとは思えません。 – Phil1970

+2

* "なぜ2番目のソリューションは機能するのですか?" - おそらく、欠陥のあるコンパイラを使用しているか、間違ったオプションを指定して起動している可能性があります。 –

答えて

-1

まあ、GCCの両方が許可されていません。私の推測では、もしあなたのコンパイラが他のコンパイラを許可していれば、それは曖昧さ回避を避けることです。あなたがthis->Arr()を書くとき

は、コンパイラは、コンストラクタを呼び出すだけではなく、新しいオブジェクトをインスタンス化することを意図していることを知ることができません。あなたがthis->Arr::Arr()を書くとき

、コンパイラは、クラスArr静的機能Arr()を呼び出すことを知っています。

関連する問題