Я получаю предупреждение от -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
Компилятор правильный. Ваш operator++
повторная реализация должна возвращать значение того же типа, что и *this
то есть some_class<...>
, На самом деле, многие реализации operator++()
конец в
return *this;
См. Раздел «Унарные арифметические операторы» в этот ответ для более сложной дискуссии.
Других решений пока нет …