c ++ определение статического члена класса шаблона с указателем типа внутреннего класса - PullRequest
3 голосов
/ 21 марта 2010

У меня есть шаблонный класс, как здесь (в заголовке) с внутренним классом и статическим членом указателя типа на внутренний класс

template <class t> class outer {
    class inner {
        int a;
    };

    static inner *m;
};

template <class t> outer <t>::inner *outer <t>::m;

когда я хочу определить этот статический член, я говорю «ошибка: ожидаемый конструктор, деструктор или преобразование типа перед '*' токеном» в последней строке (mingw32-g ++ 3.4.5)

1 Ответ

4 голосов
/ 21 марта 2010

Необходимо указать, что класс inner является имя типа , поскольку он зависит от параметра шаблона, а компилятор C ++ предполагает, что имя inner в этом контексте не тип:

template <class t> typename outer<t>::inner* outer<t>::m;

Обоснование: имя inner в приведенной выше строке зависит от имени типа, t. Компилятор C ++ на данный момент не знает, что такое inner, потому что значение имени inner может отличаться в зависимости от t. Например, предположим, что где-то еще в коде есть специализированная версия класса outer для int:

template <>
class outer<int> {
    int inner;
};

Теперь outer<int>::inner больше не называет тип; он называет переменную-член.

Таким образом, в общем случае значение outer<t>::inner будет неоднозначным, и C ++ разрешает эту неоднозначность, предполагая, что inner не называет тип. Если вы не говорите, что это так, префиксом его с typename: typename outer<t>::inner. (В этом контексте inner называется зависимым именем , поскольку оно зависит от точного типа t.)

...