2017-06-09 5 views
0
#include <bits/stdc++.h> 
using namespace std; 
class A { 
    int x; 
public: 
    class B { 
    public: 
     int y; 
     B(int _y) : y(_y) {} 
     explicit operator A() const { 
      return A(y); 
     } 
    }; 
    explicit A (int _x) : x(_x) {} 
    explicit A (const A& o) : x(o.x) {} 
}; 
typedef unsigned int size_type; 
int main() { 
    return 0; 
} 

Error: g++ -Wall -I./ -I/home/abdelrahman/main-repo/ -o "testt" "testt.cpp" (in directory: /home/abdelrahman/Desktop)明示的なC++キーワード:このコードで何が問題になっていますか?明示的なコピーコンストラクタをマーキング

testt.cpp: In member function ‘A::B::operator A() const’: testt.cpp:11:14: error: no matching function for call to ‘A::A(A)’ return A(y); ^

Compilation failed.

+0

コンストラクタを 'クラスB 'の前に移動しますか? – NathanOliver

+0

明示的なコピーコンストラクタは、値による戻りを禁止する傾向があります。https://stackoverflow.com/questions/4153527/explicit-copy-constructor-behavior-and-practical-uses –

+0

fyi: fromコピーコンストラクタとしてコンパイルします。今、なぜかを見てください。 –

答えて

1

は、コンパイラが暗黙のうちにそれを使用することが許可されていない、そしてそれは関数が戻るときに何が起こるかであることを意味します - コピーコンストラクタの暗黙の使用があるときの戻り値関数の外にコピーされます。

引数を渡すときも同じですが、コンパイラは引数を作成するために暗黙的にコピーコンストラクタを使用します。

次は、これらの理由で失敗した最小限の例です:あなたが作ることができる唯一のコピーが明示的なコピーです

class A 
{ 
public: 
    A(){} 
    explicit A(const A&){} 
}; 

void g(A a) 
{ 

} 

A f() 
{ 
    A a; 
    return a; // Fails; no suitable constructor 
} 

int main() 
{ 
    A a; 
    g(a); // Fails; no suitable constructor 
} 

- もののソースコード明示的にコピーしたオブジェクトは、そのような

A a; 
A b(a); // Succeeds because this is an explicit copy. 
として

explicitを変換コンストラクタ以外のものに使用することにはほとんど意味がありません。

+0

暗黙のコピーとはどういう意味ですか?値を返すと暗黙の変換はどこで行われますか? 'A'型の明示的なパラメータを持つコピーコンストラクタを呼び出すべきではありません。また、別のコンストラクタがデフォルトのコンストラクタを削除するという定義のコードに何か間違っていると思うので、返り値の 'A()'では使用しないでください。 –

関連する問題