1

使用 -Weffc++ 编译并扩展 boost::iterator_facade 时,我收到编译器警告:基类具有非虚拟析构函数。我能做些什么来解决这个问题?

这是示例代码:

#include <iostream>
#include <boost/iterator/iterator_facade.hpp>

struct my_struct_t {
  int my_int;
  my_struct_t() : my_int(0) {
  }
};

class my_iterator_t : public boost::iterator_facade<
                          my_iterator_t,
                          my_struct_t const,
                          boost::forward_traversal_tag
                         > {
  private:
  friend class boost::iterator_core_access;

  my_struct_t my_struct;

  public:
  my_iterator_t() : my_struct() {
  }

  void increment() {
    ++ my_struct.my_int;
  }

  bool equal(my_iterator_t const& other) const {
    return this->my_struct.my_int == other.my_struct.my_int;
  }

  my_struct_t const& dereference() const {
    return my_struct;
  }
};

int main() {
  my_iterator_t my_iterator;
  std::cout << my_iterator->my_int << "\n";
  ++my_iterator;
  std::cout << my_iterator->my_int << "\n";
  return 0;
}

我在 Fedora 19 上编译如下:

$ g++ test.cpp -std=gnu++0x -Weffc++ -o test

这是实际的警告:

g++ test.cpp -std=gnu++0x -Weffc++ -o test
test.cpp:10:7: warning: base class ‘class boost::iterator_facade<my_iterator_t, const my_struct_t, boost::forward_traversal_tag>’ has a non-virtual destructor [-Weffc++]
 class my_iterator_t : public boost::iterator_facade<
       ^

谢谢。

4

1 回答 1

1

-Weffc++ 选项启用有关违反 Scott Meyers 的有效 C++ 书中的某些样式指南的警告。您的代码违反了第 7 条:在多态基类中使析构函数为虚拟。所以编译器不是在抱怨你的迭代器,而是在抱怨基类:boost::iterator_facade。我认为您无法通过修改自己的代码来消除警告。至于为什么多态基类中的虚拟析构函数如此重要,这里有一个很好的答案。

于 2014-01-18T13:39:54.987 回答