根据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/