Typedef внутри класса шаблона не работает - PullRequest
8 голосов
/ 02 апреля 2011

У меня проблема со следующим кодом:

template <typename U>
class lamePtr
{
public:
    typedef U* ptr;
};

template <typename U>
class smarterPointer
{
    public:
    void funFun()
    {
        typedef lamePtr<U> someType;
        someType::ptr query;
    }
};

Как видите, внутри lamePtr у меня есть typedef. Внутри класса smarterPointer у меня есть функция funFun (). Что я пытаюсь сделать, это сделать еще один typedef someType. До этой строки все работает нормально, пока мы не доходим до строки с запросом someType :: ptr.

Здесь я хочу, чтобы «запрос» стал lamePtr :: ptr (простое значение, а не typedef;). Тем не менее, я получаю ошибки компиляции (с gcc 4.4.3):

temp.cpp: In member function ‘void smarterPointer&ltU>::funFun()’:
temp.cpp:15: error: expected ‘;’ before ‘query’

Что я здесь не так делаю?

Ответы [ 2 ]

13 голосов
/ 02 апреля 2011

someType, поскольку lamePtr<U> является «зависимым именем».Это зависит от того, что U означает, есть ли член ptr и, если да, то что это за «вещь» этого члена.

Конечно, вы знать, что для всех T, lamePtr<T>::ptr является типом, но на данном этапе компиляции синтаксический анализатор не знает этого.

Используйте ключевое слово typename , чтобы намекнуть напарсер что это тип.Остальное будет решено позже в процессе компиляции.Просто небольшая причуда C ++.

template <typename U>
class lamePtr
{
public:
    typedef U* ptr;
};

template <typename U>
class smarterPointer
{
    public:
    void funFun()
    {
        typedef lamePtr<U> someType;
        typename someType::ptr query;
    }
};
9 голосов
/ 02 апреля 2011

Вам нужно ключевое слово typename, чтобы указать, что someType::ptr является типом.

    typename someType::ptr query;

См. Официально, для чего используется typename? для подробностей.

...