不明确的类型引用

发布于 2024-10-26 06:26:26 字数 745 浏览 0 评论 0原文

为什么这有效:

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 类。

Why does this works :

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;
}

But not this :

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;
}

In my code, foo is actually boost::shared_ptr and, as you can see, I'm trying so factor some typedefs using a Shared class.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

柳若烟 2024-11-02 06:26:26

因为 B 继承了 foo 并间接继承了 foo,并且都包含成员 type 。你指的是哪一个?

您简单的第一段代码具有 Btype 隐藏 Atype,但在更复杂的第二段代码中不会发生这种情况,它涉及更深的继承树。

Because B inherits foo<B> and, indirectly, foo<A>, and both contain a member type. Which did you mean?

Your simple, first piece of code has B's type hiding A's type, but that doesn't happen in the more complex second piece of code, which involves a deeper inheritance tree.

烟火散人牵绊 2024-11-02 06:26:26

Because you actually have 2 type typedefs. One from A, which gets his from shared<A> and one from shared<B>. In your first case, you hide the type typedef of the A base class with the typedef in B.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文