Ваша operator=
функция ничего не возвращает, если предполагается, что она возвращает ссылку на объект типа test
.Поэтому измените это:
test& operator=(const T & new_value)
{
value = new_value;
}
На это:
test& operator=(const T & new_value)
{
value = new_value;
//dereference the "this" pointer to get a lvalue reference to
//the current object
return *this;
}
Обратите внимание, что при доступе к неявному указателю this
класса (это указатель, указывающий на класс экземпляра)Сам в памяти, к которой вызывается метод) и разыменовывая его, вы получаете доступ к lvalue-ссылке на экземпляр класса.Поэтому, если вы возвращаете ссылку lvalue из вашего метода класса, эта ссылка затем может быть передана другим функциям, которые принимают ссылки в качестве аргументов, и / или могут быть вызваны другие методы для этого возвращенного экземпляра класса.Это позволяет использовать operator=
в «цепочках» функций и вызовов методов, где после вызова метода operator=
вызывается другой метод в результирующем экземпляре модифицированного объекта.Например, вы можете сделать что-то вроде:
test<int> a;
a.value = 5;
int b = (a = 6) + 5; //outputs the value 11
Если вы создали print()
метод для вашего test
объекта, вы также можете сделать что-то вроде следующего:
test<int> a;
a.value = 7;
(a = 8).print();
Этот код возвращает test
экземпляр класса a
после метода operator=
, а затем вызывает метод print()
для этого экземпляра, распечатывая значение 8
.