нет соответствующей функции в классе шаблона - PullRequest
5 голосов
/ 03 октября 2010

При попытке скомпилировать этот код на моем компиляторе 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 ]

2 голосов
/ 03 октября 2010

Изменить следующим образом:

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

Значения RV (например, возвращаемые экземпляром функции создателя) могут связываться только с «ссылкой на const» в C ++ 03.

BTW,что-то дает мне ощущение, что вы ожидали, что вторая строка в вашем main вызовет оператор присваивания.Это не правильно.Это утверждение, несмотря на его внешний вид, вызывает конструктор копирования для создания pt2.

EDIT 2:

$ 8,5 / 14- "Инициализация, которая происходит в виде

Tx = a;

, а также при передаче аргументов, возврате функции, создании исключения (15.1), обработке исключения (15.3) и инициализации составного элемента (8.5.1) называется copy-initialization. "

1 голос
/ 03 октября 2010

Ваши copy c-tor и assignment operator [из Pattern класса] принимают параметры как non-const ссылку.

creator<double>() создает временный объект (объект), и временные ссылки не могут быть связаны с неконстантными ссылками. Итак, вы получите эти ошибки.

ISO C ++ 03 [8.5.3/5]

В противном случае ссылка должна быть на энергонезависимый константный тип (т.е. cv1 должен быть константой ). [Пример:

double & rd2 = 2,0; // ошибка: не lvalue и ссылка не постоянная

Попробуйте передать параметры (c-tor копирования и оператора присваивания) как const ссылки.

...