Это ошибка в моем коде или в анализе g ++ -Weffc ++?

Я получаю предупреждение от -Weffc ++, которое кажется неправильным. Я мог бы использовать вторую пару глаз, чтобы подтвердить:

template<template<class> class CLASS_TYPE, typename T>
class some_class
{
typedef CLASS_TYPE<T> class_type;

public:
virtual ~some_class() {};
virtual class_type& operator++() = 0;
};

template<typename T>
class other_class
:
public some_class<other_class, T>
{
public:
virtual ~other_class() {};
other_class<T>& operator++() {
return *this;
};
};

int main() {

return 0;
}

Предупреждение:

main.cpp:8:39: warning: prefix ‘some_class<CLASS_TYPE, T>::class_type& some_class<CLASS_TYPE, T>::operator++()’ should return ‘some_class<CLASS_TYPE, T>&’ [-Weffc++]
virtual class_type& operator++() = 0;

Протестировано с g++ (GCC) 4.9.3,

ОБНОВИТЬ

Добавлен дополнительный класс для предоставления примера реализации. Предупреждение правильный Предварительно, но я думаю, что я не согласен с тем, чтобы предупреждение появилось в чисто виртуальной функции, поскольку оно должно быть интерфейсом для другого класса.

@Frerich Raabe предоставил необходимые разъяснения относительно того, почему g ++ считает, что я нарушаю правила, установленные в Effective C ++, и я принял этот ответ.

Чтобы заглушить предупреждение, я добавил следующее:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Weffc++"virtual class_type& operator++() = 0;
#pragma GCC diagnostic pop

0

Решение

Компилятор правильный. Ваш operator++ повторная реализация должна возвращать значение того же типа, что и *thisто есть some_class<...>, На самом деле, многие реализации operator++() конец в

return *this;

См. Раздел «Унарные арифметические операторы» в этот ответ для более сложной дискуссии.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector