有2个非模板类A
,B
有一些静态模板方法。
调用A
中的B
类静态方法,调用来自B
的{{1}}类静态方法。源代码仅用于说明(非实际代码)......
A.H
A
我在NetBeans中遇到g ++编译器问题。在编译期间发生以下错误:错误:嵌套名称说明符中使用的类型A不完整,g ++。
我尝试在两个类中添加前向声明,但没有成功。
有一个较旧的错误:
答案 0 :(得分:7)
您的头文件之间存在循环依赖关系。由于您的类紧密交织在一起,我建议将它们合并到一个头文件中,结构如下:
class A
{
public:
template <class T>
void f1();
};
class B
{
...
};
template <class T>
void A::f1()
{
// Use full definition of class B
}
如果你坚持为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
}
答案 1 :(得分:4)
因为存在循环依赖关系,所以需要仔细安排类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
以下是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
使用这种方法,您可以先包含A.h
或B.h
,但不会出现问题。
答案 2 :(得分:0)
您的问题是循环标头依赖。