Неоднозначная ссылка на тип - PullRequest
1 голос
/ 27 марта 2011

Почему это работает:

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 класса.

Ответы [ 2 ]

4 голосов
/ 27 марта 2011

Поскольку B наследует foo<B> и, косвенно, foo<A>, и оба содержат член type. Что ты имеешь в виду?

Ваш простой первый фрагмент кода имеет B s type , скрывающий A * type, но этого не происходит в более сложном втором фрагменте кода, который включает в себя более глубокое дерево наследования.

1 голос
/ 27 марта 2011

Потому что у вас на самом деле 2 type typedefs.Один от A, который получает его от shared<A> и один от shared<B>.В первом случае вы скрываете type typedef базового класса A с typedef в B.

...