有2个非模板类A,B有一些静态模板方法.
从类A静态方法中B调用,从类B静态方法A调用.源代码仅用于说明(不是真实代码)......
啊
#include "B.h"
class A
{
public:
template <class T>
void f1 ()
{
T var1= ...;
T var2 = B::f4(T);
}
template <class T>
T f2()
{
return ...
}
};
#include "A.h"
class B
{
public:
template <class T>
void f3 ()
{
T var1= ...;
T var2 = A::f2(T); //Error
}
template <class T>
T f4()
{
return ...
}
};
Run Code Online (Sandbox Code Playgroud)
我在NetBeans中遇到g ++编译器的麻烦.在编译期间发生以下错误:错误:在嵌套名称说明符g ++中使用的不完整类型A.
我试图在两个类中添加前向声明,但没有成功.
有一个旧的错误:
您的头文件之间存在循环依赖关系.由于你的类紧密交织在一起,我建议将它们合并到一个头文件中,结构如下:
class A
{
public:
template <class T>
void f1();
};
class B
{
...
};
template <class T>
void A::f1()
{
// Use full definition of class B
}
Run Code Online (Sandbox Code Playgroud)
如果你坚持为A和B使用单独的头文件(由于它们最终包含彼此不会产生任何差别),你需要对它们进行重组,以便其中一个头不包括另一个,因此,至少需要在单独的文件中定义一个依赖模板函数.例如:
// File "a_no_b.h"
class A
{
public:
template <typename T>
void f1();
};
// File "b_no_a.h"
class B
{
public:
template <typename T>
void f3();
};
// File "a.h"
#include "a_no_b.h"
#include "b_no_a.h"
template <typename T>
void A::f1()
{
// Use full definition of class B
}
// File "b.h"
#include "b_no_a.h"
#include "a_no_b.h"
template <typename T>
void B::f3()
{
// Use full definition of class A
}
Run Code Online (Sandbox Code Playgroud)
因为有一个循环依赖,你需要仔细安排的类的声明A,并B因此被定义的成员函数之前,它们都宣称。
这是A.h:
#ifndef A_H
#define A_H 1
class A
{
public:
template <class T>
void f1 ();
template <class T>
T f2();
};
#include "B.h"
template <class T>
void A::f1()
{
T var1= ...;
T var2 = B::f4(T);
}
template <class T>
T A::f2()
{
return ...
}
#endif
Run Code Online (Sandbox Code Playgroud)
这是B.h:
#ifndef B_H
#define B_H 1
class B
{
public:
template <class T>
void f3 ();
template <class T>
T f4();
};
#include "A.h"
template <class T>
void B::f3()
{
T var1= ...;
T var2 = A::f2(T);
}
template <class T>
T B::f4()
{
return ...
}
#endif
Run Code Online (Sandbox Code Playgroud)
使用这种方法,您将能够包含A.h或B.h首先包含其中之一,而不会出现问题。