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

Ian*_*Ian 19 c++ g++

有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.

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

有一个旧的错误:

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

Ada*_*eld 7

您的头文件之间存在循环依赖关系.由于你的类紧密交织在一起,我建议将它们合并到一个头文件中,结构如下:

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)


Dan*_*ien 5

因为有一个循环依赖,你需要仔细安排的类的声明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.hB.h首先包含其中之一,而不会出现问题。


Gen*_*yev 0

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