C++ 具有正向声明类的模板函数
这里没有问题。我有一个具有循环依赖项的类,所以我向前声明了它。现在,我计划用这个来尝试一个模板 //在C.hC++ 具有正向声明类的模板函数,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
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的真实代码中它提到了