Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有正向声明类的模板函数_C++_Templates - Fatal编程技术网

C++ 具有正向声明类的模板函数

C++ 具有正向声明类的模板函数,c++,templates,C++,Templates,这里没有问题。我有一个具有循环依赖项的类,所以我向前声明了它。现在,我计划用这个来尝试一个模板 //在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, stri

这里没有问题。我有一个具有循环依赖项的类,所以我向前声明了它。现在,我计划用这个来尝试一个模板

//在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类;
甲级{
公众:
虚空foo(C*C);
模板
void changeProperty(C*C、字符串和s){
void*obj=c->getMap()->at(s);//未编译
//(为简洁起见,未包括其余部分)
}
}

这无法在指定的行处编译,该行声明类C没有函数“getMap()”。这个问题能解决吗?如果是这样,怎么做?

changeProperty
的定义移出类(因此它不是
inline
),并将其放置在看到
类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)
   }
C类;
甲级{
公众:
虚空foo(C*C);
模板
void changeProperty(C*C、字符串和s);
}
// ...
C类{
公众:
虚拟void getMap();
}
// ...
模板
void A::changeProperty(C*C、字符串和s)
{
void*obj=c->getMap()->at(s);//编译
//(为简洁起见,未包括其余部分)
}

这就是为什么不在头文件中定义函数,而是在源文件(.cpp)中定义函数的原因。我认为模板函数不同,必须在头文件中定义。这就是大多数例子所显示的。我想我弄错了。是的,是的。不能将源文件放在其他文件中。但你仍然可以在标题中进一步定义它。我相信你可以。我把定义放在C.cpp文件中,然后它就编译了。好吧,祝你好运。@PeterWood,这与循环依赖性问题无关,所以让我们假设这是OP示例中的一个无意输入错误。否则,如果我们要学究气,我会指出没有循环引用,因为
C
没有提到
A
,但我假设在OP的真实代码中它提到了