Нет соответствующей функции в классе шаблона
При попытке скомпилировать этот код на моем компиляторе mingw32 я не получаю соответствующую функцию-член
#include <iostream>
using std::cout;
template <class T>
class Pattern
{
public:
Pattern(): element(){
cout<< "default c-tor";
}
Pattern(Pattern ©): 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 ©): 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
Рекомендации.