Может кто-нибудь помочь мне со спецификаторами вложенных имен в шаблонах C ++? - PullRequest
2 голосов
/ 22 апреля 2011

Что не так со следующим примером кода?Он не компилируется в GCC.Зачем?

template <class TA>
struct A
{
    template <class TAB> struct B;
};

template <class TC>
struct C {};


template <class TD>
struct D
{
    template <class TTD> class T {};
};    

template<class TA>
template<class TBA>
struct A<TA>::B : C<typename D<TA>::T<TBA> >
{
    int foo;
};

Выход GCC 4.3.4:

error: template argument 1 is invalid
error: expected `{' before ‘>’ token
error: expected unqualified-id before ‘>’ token

Ответы [ 2 ]

7 голосов
/ 22 апреля 2011

Сообщение об ошибке Clang немного более полезно:

error: use 'template' keyword to treat 'T' as a dependent template name
struct A<TA>::B : C<typename D<TA>::T<TBA> >
                                    ^
                                    template

Для получения дополнительной информации прочитайте часто задаваемые вопросы о переполнении стека C ++ "Где и почему я должен поставить" template "и" typename "на зависимых именах? "

6 голосов
/ 22 апреля 2011
struct A<TA>::B : C<typename D<TA>::template T<TBA> >

Чтобы имя шаблона было явно определено аргументами шаблона, должно быть известно, что имя относится к шаблону.

Когда имя специализации шаблона члена появляется после,или -> в выражении postfix или после спецификатора nested-name в квалифицированном идентификаторе, а выражение postfix или квалифицированный идентификатор явно зависит от параметра-шаблона (14.6.2), имя шаблона элемента должно бытьс префиксом шаблона ключевого слова.В противном случае предполагается, что имя не-шаблон

T появляется после спецификатора вложенного имени D<TA>, который зависит от параметра шаблона TA.Конструкция D<TA>::T<TBA> должна интерпретировать T как имя шаблона класса, и поэтому ключевое слово template предписано стандартом в этой точке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...