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){ 

RValues(例如由创建函数实例化返回的值)只能绑定到 C++03 中的“对 const 的引用”。

顺便说一句,有些东西让我感觉您希望 main 中的第二行调用赋值运算符。这是不正确的。尽管它的外观,这个语句调用复制构造函数来创建 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)。
[例子:

双&rd2 = 2.0; //错误:不是左值且引用不是 const

尝试将参数(复制 c-tor 和赋值运算符)作为const引用传递。

于 2010-10-03T03:31:28.127 回答