错误:嵌套名称说明符中使用的类型不完整

时间:2010-12-31 21:57:53

标签: c++ g++

有2个非模板类AB有一些静态模板方法。

调用A中的B类静态方法,调用来自B的{​​{1}}类静态方法。源代码仅用于说明(非实际代码)......

A.H

A

我在NetBeans中遇到g ++编译器问题。在编译期间发生以下错误:错误:嵌套名称说明符中使用的类型A不完整,g ++。

我尝试在两个类中添加前向声明,但没有成功。

有一个较旧的错误:

http://gcc.gnu.org/ml/gcc-bugs/2005-02/msg01383.html

3 个答案:

答案 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)

因为存在循环依赖关系,所以需要仔细安排类AB的声明,以便在定义成员函数之前声明它们。

以下是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.hB.h,但不会出现问题。

答案 2 :(得分:0)

您的问题是循环标头依赖。