根据http://msdn.microsoft.com/en-us/library/9ekhdcxs(v=vs.80).aspx



我的问题是当出现以下情况时如何消除此错误:

class A;  // Object

class B   // Container
{
   public:
     typedef int SomeTypedef;
   private:
     A a;   // C2079
};

class A {
   void Foo(B::SomeTypedef);
};

我不能在声明B之前声明A,因为A需要使用B的typedef,并且由于这个错误,我不能在A之前声明B。

一种可能的解决方案是使用指向A的指针而不是堆栈变量,但是我不希望使用指针(在这种情况下)。

另一个解决方案是不使用typedef或不将其放在类B中。但是,如果它属于B并且我不想污染项目的 namespace ,例如B::SomeTypedef比SomeTypedef更合适,该怎么办?

最佳答案

尽管嵌套类可能是您想要的,但您的设计还是有问题的:

class B {
   public:
     typedef int SomeTypedef;
   private:
     class A {
       void Foo(SomeTypedef);
     };
     A a;
};

如果没有,也可以使用CRTP代码中常见的另一个类来解决。
template<typename T>
struct foo;

class A;
class B;

template<>
struct foo<B> {
  typedef int SomeTypedef;
};

class A {
   void Foo(foo<B>::SomeTypedef);
};

class B : foo<B> {
   private:
     A a;
};

或者,您可以使用另一个 namespace 。

关于c++ - 当正向声明不够时,如何避免 "'标识符使用未定义的class/struct/union 'name'错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10356737/

10-12 00:25
查看更多