2016-02-12 86 views
0

我收到了由-WeffC++引发的警告,这似乎是错误的。我可以用一个第二双眼睛来确认:这是我的代码或g ++分析-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

UPDATE

加入另外的类来提供实现示例。警告是正确本身,但我认为我的分歧是警告出现在纯虚拟函数上,因为它意味着要成为另一个类的接口。

@Frerich Raabe已经提供了必要的解释,为什么g ++认为我违反了Effective C++设置的规则,并且我接受了这个答案。

要消除我已经添加了以下警告:

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

'CLASS_TYPE '与'some_class '是同一类型吗?我期望'some_class '被返回。 – NathanOliver

+0

您要求确认编译器报告该代码的警告? [确认](http://coliru.stacked-crooked.com/a/8bbd9555da6f5496)。你有理由相信编译器是错的吗?你还没有说明。 –

+0

增加了额外的说明。 – Zhro

回答

1

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

return *this; 

operator++()末实现见this answer标记为“目算术运算符”更详尽的讨论部分。

+0

你是对的,但我的分歧是出现在纯虚函数上的警告。我想你是对的,*警告*是有效的;这是一个警告,而不是一个错误。 – Zhro