Ошибка шаблона C ++, Нет возврата, в функции возвращается не void - PullRequest
0 голосов
/ 22 февраля 2012

Я создал простой шаблон. Это дает мне предупреждение: «Нет возврата, в функции, возвращающей не void».

template<typename T> struct test {
public:
    test & operator=(const T & new_value) {
        value = new_value;
    }
    operator T() const {
        return value;
    }
private:
    T value;
};

Предупреждение указывает на

test & operator=(const T & new_value) {
    value = new_value;
}

Может кто-нибудь дать совет, как исправить это предупреждение.

Ответы [ 3 ]

2 голосов
/ 22 февраля 2012

Как правильно сказано в предупреждении, ваша функция ничего не возвращает, даже если она обещает вернуть test &.Просто завершите свою функцию с помощью return *this;, как это принято для операторов присваивания.

1 голос
/ 22 февраля 2012

Ваша 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.

0 голосов
/ 22 февраля 2012

Ваш компилятор сообщает вам, что ваш оператор = перегрузка неверна. Для написания функции operator = overload необходимо следовать определенному формату.

Test & Test::operator=( const Test & r )
{
    if( this != &r )
    {
        // copy member variables and initialize here
        m_MemberVar = r.m_MemberVar;
        ...
    }

    return *this;
}

NB

  1. Вы должны вернуть * это.
  2. Рекомендуется избегать копирования объекта себе с помощью

    if(this != &r){...}
    
  3. Если вы перегрузите оператор = для объекта, вам почти наверняка потребуется также предоставить конструктор копирования. например,

    Test::Test( const Test & r ){...}
    

EDIT

Вы спросили: «Если я вернусь * это, что это на самом деле возвращает» Ну, это возвращает ссылку на текущий объект. Например. в приведенном выше определении оператор = перегрузка возвращаемый тип объявляется как Test & (ссылка на объект Test).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...