Возможный дубликат:
Где и почему я должен поставить ключевые слова «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
РЕДАКТИРОВАТЬ:
Извините, я изменил некоторые вещи и код ошибки. Вот как я хочу, чтобы это было. сожалею
template<typename T>
class B
{
public:
B()
{
cout << "B()";
}
typedef typename A< B >::my_ptr x;
};
Вы должны использовать typename
, поскольку my_prt
является dependent name
,
Ваша проблема в том, что A<B>::my_ptr
является зависимым именем (зависит от B<T>
и, следовательно, на параметр шаблона T
). По этой причине компилятор не знает, должен ли он быть типом или переменной при разборе шаблона. В этой ситуации предполагается, что my_ptr
это не тип, если вы явно не скажете это так. Поэтому вам нужно добавить typename
так же, как компилятор сказал вам сделать:
typedef typename A< B >::my_ptr x;
Для более полного объяснения посмотрите на этот ответ на аналогичный вопрос.