模板类中没有匹配的函数

时间:2010-10-03 03:21:25

标签: c++ templates member-functions copy-initialization

当我尝试在我的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>();
}

有人请告诉我如何解决问题。

2 个答案:

答案 0 :(得分:2)

更改如下:

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

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

顺便说一下,有些东西给了我一种感觉,你希望你的主要第二行调用赋值运算符。这是不正确的。尽管它出现了这个声明,但它会调用复制构造函数来创建pt2。

编辑2:

  

$ 8.5 / 14-“初始化   以

的形式出现      

T x = a;

     

以及   在参数传递中,函数返回,   抛出异常(15.1),处理   例外(15.3)和汇总   成员初始化(8.5.1)是   称为复制初始化。“

答案 1 :(得分:1)

您的copy c-torassignment operator [{1}}班级]将参数作为Pattern参考。

non-const生成临时(对象),临时对象不能绑定到非const引用。所以你得到了那些错误。

ISO C ++ 03 [creator<double>()]

  

否则,引用应为非易失性const类型(即 cv1应为const )。
  [实施例:

     

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

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