Нет соответствующей функции в классе шаблона

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

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

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

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

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

РЕДАКТИРОВАТЬ 2:

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

Т х = а;

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

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

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

ISO C++ 03 [8.5.3/5]

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

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

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

Другие вопросы по тегам