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