typedef для шаблона внутри шаблона

Возможный дубликат:
Где и почему я должен поставить ключевые слова «template» и «typename»?

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

#include <iostream>
using namespace std;

// класс умных указателей

template<typename T>
class IntrusivePtr
{
public:
IntrusivePtr()
{
cout << "IntrusivePtr()";
}
};

// класс, для которого мне нужен умный указатель, который также является шаблоном

template<typename T>
class A
{
public:
A()
{
cout << "A()";
}
typedef IntrusivePtr< A<T> > my_ptr;
};

// класс, который использует умный указатель.

template<typename T>
class B
{
public:
B()
{
cout << "B()";
}

typedef A<T>::my_ptr x;
};int main()
{
B<int> ob;

return 0;
}

Может ли это быть достигнуто в C ++?
Я знаю, что новый C ++ 11 поддерживает typedefдля таких вещей, но я использую старый стандарт 🙁
Компилируя это, я получаю некоторые плохие ошибки задницы:

C: \ Users \ iuliuh \ typedef_template_class-сборка-рабочий стол-Qt_4_8_1_for_Desktop _-_ MSVC2008__Qt_SDK__Debug .. \ typedef_template_class \ main.cpp: 41:
ошибка: C2146: синтаксическая ошибка: отсутствует ‘;’ перед идентификатором «х»

C: \ Users \ iuliuh \ typedef_template_class-сборка-рабочий стол-Qt_4_8_1_for_Desktop _-_ MSVC2008__Qt_SDK__Debug .. \ typedef_template_class \ main.cpp: 41:
ошибка: C2146: синтаксическая ошибка: отсутствует ‘;’ перед идентификатором «х»

C: \ Users \ iuliuh \ typedef_template_class-сборка-рабочий стол-Qt_4_8_1_for_Desktop _-_ MSVC2008__Qt_SDK__Debug .. \ typedef_template_class \ main.cpp: 41:
ошибка: C4430: отсутствует указатель типа — предполагается int. Примечание: C ++ не
поддержка default-int

РЕДАКТИРОВАТЬ:
Извините, я изменил некоторые вещи и код ошибки. Вот как я хочу, чтобы это было. сожалею

0

Решение

template<typename T>
class B
{
public:
B()
{
cout << "B()";
}

typedef typename A< B >::my_ptr x;
};

Вы должны использовать typename, поскольку my_prt является dependent name,

3

Другие решения

Ваша проблема в том, что A<B>::my_ptr является зависимым именем (зависит от B<T> и, следовательно, на параметр шаблона T). По этой причине компилятор не знает, должен ли он быть типом или переменной при разборе шаблона. В этой ситуации предполагается, что my_ptr это не тип, если вы явно не скажете это так. Поэтому вам нужно добавить typenameтак же, как компилятор сказал вам сделать:

typedef typename A< B >::my_ptr x;

Для более полного объяснения посмотрите на этот ответ на аналогичный вопрос.

3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector