为什么会这样:
template <typename T>
struct foo
{
};
struct A
{
typedef foo<A> type;
};
struct B : public A
{
typedef foo<B> type;
};
int main()
{
B::type john;
return 0;
}
但不是这样:
template <typename T>
struct foo
{
};
template <typename T>
struct Shared
{
typedef foo<T> type;
};
struct A : public Shared<A>
{
};
struct B : public A, public Shared<B>
{
};
int main()
{
// g++ 4.5 says :
// error: reference to 'type' is ambiguous
B::type john;
return 0;
}
在我的代码中,foo
实际上是boost::shared_ptr
,正如您所看到的,我正在尝试使用typedef
类对某些Shared
进行处理。
答案 0 :(得分:4)
因为B
继承foo<B>
,间接地继承foo<A>
,并且都包含成员type
。你是什么意思?
您的简单第一段代码B
type
隐藏 A
的{{1}},但这不会发生在更复杂的第二段代码中,它涉及更深层的继承树。
答案 1 :(得分:1)
因为你实际上有2个type
typedef。一个来自A
,来自shared<A>
,一个来自shared<B>
。在第一种情况下,您使用type
中的typedef隐藏A
基类的B
typedef。