有两个非模板类A
,B
有一些静态模板方法。
从A
类调用B
中的静态方法,从B
类调用A
的静态方法。源代码只是为了说明(不是真正的代码)。
A.h
#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 ...
}
};
我在使用NetBeans中的g++编译器时遇到了问题。编译过程中出现以下错误:错误:嵌套名称说明符g++中使用的类型A不完整。
我试图将转发声明添加到这两个类中,但都没有成功。
有一个更老的bug:
发布于 2011-01-01 06:17:38
头文件之间存在循环依赖关系。由于您的类是如此紧密地交织在一起,我建议将它们合并到一个头文件中,结构如下:
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
}
发布于 2011-01-01 06:18:33
因为存在循环依赖,所以需要仔细安排类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
,而不会出现问题。
发布于 2011-01-01 06:05:16
您的问题是循环标头依赖。
https://stackoverflow.com/questions/4572483
复制相似问题