2

重複の可能性:
テンプレートをヘッダー ファイルにしか実装できないのはなぜですか?

gcc と clang でよくわからないエラーが発生します。まず、問題のコードは次のとおりです。

WaypointTree.h:

class WaypointTree {

 private:
  Waypoint *head = nullptr;
  Waypoint *current = nullptr;
  template<class Function>
    void each_recur(Waypoint *current, Function f);

 public:
  template<class Function>
    void foreach(Function f);
  void add(Waypoint *wp, Waypoint *parent = nullptr);
  bool isLast(Waypoint *wp);
  Waypoint *next();
  Waypoint *getHead() { return head; }
  void reverse() {}
};

WaypointTree.cpp:

. . .

template<class Function>
void WaypointTree::foreach(Function f) {
  each_recur(head, f);
}

. . .

フロック.cpp:

. . .

_waypoints->foreach([] (Waypoint *wp) {
        glPushMatrix(); {
          glTranslatef(wp->getX(), wp->getY(), wp->getZ());
          glutSolidSphere(0.02, 5, 5);
        } glPopMatrix();
      });

. . .

clang を使用すると、次の警告が表示されます。

lib/WaypointTree.h:17:7: warning: function 'WaypointTree::foreach<<lambda at lib/Flock.cpp:128:22> >' has internal linkage but is not defined
        void foreach(Function f);
             ^
lib/Flock.cpp:128:14: note: used here
        _waypoints->foreach([] (Waypoint *wp) {
                    ^

次のリンカ エラーが続きます。

lib/Flock.cpp:128: error: undefined reference to 'void WaypointTree::foreach<Flock::render(std::vector<Boid*, std::allocator<Boid*> >)::$_3>(Flock::render(std::vector<Boid*, std::all
ocator<Boid*> >)::$_3)'

gcc を使用すると、次のエラーのみが表示されます。

lib/WaypointTree.h:17:7: error: ‘void WaypointTree::foreach(Function) [with Function = Flock::render(std::vector<Boid*>)::<lambda(Waypoint*)>]’, declared using local type ‘Flock::ren
der(std::vector<Boid*>)::<lambda(Waypoint*)>’, is used but never defined [-fpermissive]

これのデバッグをどこから始めればよいかよくわかりませんが、テンプレートとラムダに関連しているようです。

4

2 に答える 2

7

テンプレート関数は、.cpp ではなく .h ファイルに実装する必要があります。

ここにいくつかのさらなる読書があります

于 2012-12-31T19:39:25.397 に答える
2

コンパイラは、WaypointTree.cppのコードを生成するためにの定義を必要とし_waypoints->foreach([] (Waypoint *wp)ます。したがって、cpp も含めるか、foreachヘッダー ファイルで定義する必要があります。

于 2012-12-31T19:40:51.577 に答える