Наследование от класса шаблона с использованием типа, определенного в производном классе - PullRequest
1 голос
/ 08 мая 2011

Я пытаюсь наследовать от класса шаблона, используя тип, определенный в производном классе. Я пробовал это, но это не работает.

class A : std::vector<A::B>
{
    enum B { foo, bar };
};

Есть ли элегантный способ сделать это?

Редактировать: я знаю, что это работает, если B определен ранее. Но я ищу решение, которое позволяет инкапсулировать тип B внутри класса A.

Ответы [ 4 ]

3 голосов
/ 08 мая 2011

Вы не можете пересылать объявление перечисления в C ++ 03.Просто используйте обычную композицию, указав вектор в качестве члена и перенаправив его вручную.

2 голосов
/ 08 мая 2011

Вам нужно будет определить enum B, прежде чем его использовать для наследования.

Кроме того, вы не наследуете от стандарта vector, а?

1 голос
/ 08 мая 2011

На мой взгляд, лучшее (по общему признанию, косвенное) решение - использовать композицию, а не наследование:

class A
{
    enum B { foo, bar };
    std::vector<B> bs;
};

Если по какой-то причине вам нужно (или вы действительно хотите) использовать частное наследование для встраивания вектора в ваш объект, тогда тип нужно будет определить перед классом в области пространства имен, поскольку типы нельзя использовать до того, как они будут использованы. объявлен. Если они не предназначены для доступа пользователей класса, и вы не хотите загрязнять пространство имен, содержащее ваш класс, тогда вы можете поместить их в пространство имен, чтобы указать, что они являются деталями реализации:

namespace details
{
    enum B { foo, bar };
}

class A : std::vector<details::B>
{
    typedef details::B B;               // if you don't want to write "details::B" everywhere
    static const B foo = details::foo;  // if you don't want to write "details::foo" everywhere
    // and so on.
};
0 голосов
/ 08 мая 2011

Спасибо всем за ваши ответы, но я только что нашел (редактировать: плохо) решение:

namespace
{
enum B_type { foo, bar };
}

class A : std::vector<B_type>
{
    typedef value_type B;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...