4
class Sample
{
public:
  Sample();
  Sample(int i);
  Sample(Sample& s);
  ~Sample();
};

Sample::Sample()
{
  cout<<"Default constructor called\n";
}

Sample::Sample(int i)
{
  cout<<"1-argument constructor called\n";
}

Sample::Sample(Sample& s)
{
  cout<<"Copy constructor called\n";
}

Sample::~Sample()
{
  cout<<"Destructor called\n";
}

void Fun(Sample s)
{

}

int main()
{
  Sample s1;
  Fun(5);

  return 0;
}

5 の暗黙的な変換を期待していましたが、上記のコードをコンパイルすると、次のエラーが発生します。

main.cpp:7:8: error: no matching function for call to ‘Sample::Sample(Sample)’
main.cpp:7:8: note: candidates are:
Sample.h:10:3: note: Sample::Sample(Sample&)
Sample.h:10:3: note:   no known conversion for argument 1 from ‘Sample’ to ‘Sample&’
Sample.h:9:3: note: Sample::Sample(int)
Sample.h:9:3: note:   no known conversion for argument 1 from ‘Sample’ to ‘int’
Sample.h:8:3: note: Sample::Sample()
Sample.h:8:3: note:   candidate expects 0 arguments, 1 provided
Helper.h:6:13: error:   initializing argument 1 of ‘void Fun(Sample)’

何が問題ですか?コピー コンストラクターを削除すると、上記のコードは正常にコンパイルされます。

前もって感謝します。

4

1 に答える 1

6

一時変数は非 const 参照にバインドできません。コピー コンストラクターは次のようにする必要があります。

Sample::Sample(const Sample&)

それを削除すると、上記の署名を持つ単純なものを生成するようコンパイラーに指示します。

于 2012-08-26T12:14:26.980 に答える