带有前向声明类的模板函数

时间:2013-05-21 12:37:07

标签: c++ templates

Noob在这里提问。我有一个循环依赖的类,所以我转发声明它。现在,我打算尝试用这个模板。

//在C.h

class C {
public:
  virtual void getMap();
}

//在A.h

    class C;
    class A {
    public:
       virtual void foo(C *c);

    template <class T>     
       void changeProperty(C *c, string& s) {
          void* obj = c->getMap()->at(s); // does not compile 
          // (did not include the rest for brevity)
       }
    }

这无法在指定的行编译,声明C类没有函数'getMap()'。这可以修复吗?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:3)

changeProperty的定义移出课堂(因此它不是inline),并在看到class C的定义后将其放置在某处。

因此,预处理结果将最终结果如下:

class C;
class A {
public:
   virtual void foo(C *c);

template <class T>     
   void changeProperty(C *c, string& s);
}

// ...

class C {
public:
  virtual void getMap();
}

// ...

template <class T>     
   void A::changeProperty(C *c, string& s)
   {
      void* obj = c->getMap()->at(s); // compiles
      // (did not include the rest for brevity)
   }