Нет шаблона класса с именем X в шаблонном классе - PullRequest
6 голосов
/ 26 апреля 2011

При попытке скомпилировать этот (подобный CRTP) код с помощью GCC 4.6.0:

template<template<class> class T> struct A;

template<class T> 
struct B: A<B<T>::template X> {
    template <class U> struct X { U mem; };
};

B<int> a;

Я получаю сообщение об ошибке «test.cpp: 3: 26: ошибка: нет шаблона класса с именем« X »в« struct B »». Почему X кажется невидимым вне определения класса?

Ответы [ 3 ]

4 голосов
/ 26 апреля 2011

Как правильно указывает Эмиль Кормиер здесь проблема заключается в том, что в месте создания A, B все еще является неполным типом, и вы не можете использовать внутренний шаблон.

Решением для этого является перемещение шаблона X за пределы шаблона B. Если он не зависит от конкретного экземпляра T шаблона B, просто переместите его на уровень пространства имен, если он зависит от экземпляра, вы можете использовать черты типа:

template <typename T>
struct inner_template 
{
   template <typename U> class tmpl { U mem; }; // can specialize for particular T's
};
template <typename T>
struct B : A< inner_template<T>::template tmpl >
{
};
2 голосов
/ 26 апреля 2011

struct B все еще считается неполным типом, когда вы указываете A<B<T>::template X> в качестве базового класса.

1 голос
/ 26 апреля 2011

Вы пытаетесь использовать элемент B в качестве родителя B, создавая ситуацию рекурсивного поиска. Например, это не компилируется либо:

template<template<class> class T> struct A {};

struct B : public A<B::nested>
{
        struct nested {};
};
...