这是我的代码中的错误还是g ++对-Weffc ++的分析?

时间:2016-02-12 14:05:58

标签: c++ templates g++ gcc-warning effective-c++

我收到-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

1 个答案:

答案 0 :(得分:1)

编译器是正确的。您的operator++重新实现应返回与*this相同类型的值,即some_class<...>。实际上,operator++()的许多实现都以

结尾
return *this;

请参阅标记为&#39;一元算术运算符&#39;在this answer进行更详细的讨论。