5

このコードを mingw32 コンパイラでコンパイルしようとすると、一致するメンバー関数エラーが発生しません

#include <iostream> 
using std::cout;
template <class T>
class Pattern
{
public:
    Pattern(): element(){

        cout<< "default c-tor";
        }

    Pattern(Pattern &copy): element(copy.element){

        cout<< "copy c-tor";

        }

    Pattern& operator=(Pattern &assgn)
    {
        cout<<" assignment operator";
       element = assgn.element;
       return *this;
    }

    ~Pattern(){

        cout<<"destructor";

        }

private:
     T element;
};

template <class T>
Pattern<T> creator()
{
   cout<< "Testing creator";
   Pattern<T> pat;
   return pat;
}

int main()
{
   Pattern<double> pt1(creator<double>());
   Pattern<double> pt2 = creator<double>();
}

誰か問題の解き方を教えてください。

4

2 に答える 2

2

次のように変更します。

Pattern(Pattern const &copy): element(copy.element){ 

RValue (作成者関数のインスタンス化によって返されるものなど) は、C++03 の「const への参照」にのみバインドできます。

ところで、メインの 2 行目で代入演算子を呼び出すことを期待していたような気がします。これは正しくありません。このステートメントは、そのように見えますが、コピー コンストラクターを呼び出して pt2 を作成します。

編集2:

$8.5/14- 「フォームで発生する初期化

T x = a;

同様に、引数の受け渡し、関数の戻り、例外のスロー (15.1)、例外の処理 (15.3)、および集合メンバーの初期化 (8.5.1) は、コピー初期化と呼ばれます。

于 2010-10-03T03:32:51.410 に答える
1

あなたのcopy c-torand assignment operator[of Patternclass] は、パラメーターをnon-const参照として受け取ります。

creator<double>()一時(オブジェクト)を生成し、一時は非定数参照にバインドできません。したがって、これらのエラーが発生します。

ISO C++03 [ 8.5.3/5]

それ以外の場合、参照は非揮発性の const 型に対するものでなければなりません (つまり、cv1 は const でなければなりません)。
[例:

double& rd2 = 2.0; //エラー: 左辺値ではなく、参照も const ではありません

(copy c-tor と代入演算子の) パラメータをconst参照として渡してみてください。

于 2010-10-03T03:31:28.127 に答える