5

Можно ли использовать typedef на контейнере std, не специализируясь на нем?Шаблон typedef для контейнера std (без специализации)?

код, как это работает:

typedef std::vector<int> intVector; 

Но для этого кода:

template <typename T> 
typedef std::vector<T> DynamicArray<T>; 

Я получаю сообщение об ошибке:

template declaration of 'typedef'

можно сделать это в C++ ??

+0

Учитывая, что все, что вы в основном делаете, это переименование 'std :: vector', насколько непристойным было бы использовать' #define DynamicArray std :: vector'? – suszterpatt

+0

@suszterpatt - правда, но я стараюсь держать его современным и избегать использования небезопасных макросов :) – dtech

ответ

9

Да, в C++ 11.

template <typename T> 
using DynamicArray = std::vector<T>; 

(Не то, что вы должны использовать именно этот псевдоним.)

+0

Он, похоже, не работает в Visual Studio 2010 SP1. Я получаю «нераспознаваемое объявление/определение шаблона» Я полагаю, что он еще не поддерживается MS? – dtech

+1

@ddriver: Нет, это не так. И не VC11, либо AFAIR. Если вы хотите C++ 11, используйте GCC или Clang. –

+0

Я нашел обходное решение для VS, просто наследуя вектор. Пожалуйста, см. Ответ, который я добавил, и пролил свет, если это не очень хорошая идея. Благодаря! – dtech

2

Общее решение (если вы не используете C++ 11), чтобы сделать это:

template<class T> 
struct DynamicArray 
{ 
    typedef std::vector<T> Type; 
}; 

и использовать его в качестве DynamicArray<Something>::Type.

6

Если ваша поддержка компилятора C++ 11:

template <typename T> 
using DynamicArray = std::vector<T>; 

в противном случае (с ++ 98 или старше), вы можете использовать подсказка структура как следующий

template<typename T> 
struct DynamicArray 
{ 
    typedef std::vector<T> type; 
}; 

, а затем использовать его в качестве

DynamicArray<int>::type my_array; 

Унаследовано от std :: vector - это возможное решение, но имейте в виду, что контейнеры STL не имеют виртуального деструктора. то есть:

template <typename T> 
struct DynamicArray: vector<T> { ... }; 

int main() { 
    vector<int>* p = new DynamicArray<int>(); 
    delete p; // this is Undefined Behavior 
    return 0; 
} 
+0

Да, но зачем мне динамически выделять вектор, когда он использует динамическое распределение памяти для своих данных внутри? – dtech

+0

Кроме того, я не могу написать деструктор самостоятельно, я думаю, что деструктор вектора должен нести ответственность за свои данные, мне нужно только позаботиться о дополнительных материалах, которые я добавил. Возможно, я ошибаюсь, я не слишком хорош с C++. – dtech

+0

Я имею в виду, конечно, могут быть проблемы с полиморфным использованием, но поскольку цель состоит в том, чтобы просто использовать производный класс, я не думаю, что будут проблемы из-за отсутствия виртуального деструктора. Я имею в виду, что я не собираюсь называть delete на указателе на вектор, который на самом деле указывает на DynamicArray, который также не имеет дополнительных динамически распределенных членов, требующих дополнительной осторожности. Пожалуйста, поправьте меня, если я ошибаюсь. Благодаря! – dtech

3

Этот синтаксис недействителен в C++, нет такой функции, как «шаблон typedef».

template <typename T> 
typedef std::vector<T> DynamicArray<T>; 

Однако, C++ 11 вводит синтаксис шаблона псевдонима, который почти так:

template <typename T> 
using DynamicArray = std::vector<T>; 

В C++ 03 вы можете использовать шаблон metafunction как:

template<class T> 
struct DynamicArray 
{ 
    typedef std::vector<T> type; 
}; 
0

Чтобы добавить свое решение в смесь

Поскольку функция C++ 11 не поддерживается Visual Studio, я решил просто наследовать зЬй :: вектор, используя эту функцию, чтобы добавить некоторые функции:

template <typename T> 
class DynamicArray : public std::vector<T> { 
public: 
    DynamicArray& operator<<(const T& value) 
    { 
     push_back(value); 
     return *this; 
    } 
}; 

Теперь кроме push_back, сцепление также поддерживается:

DynamicArray<int> array; 
array << 1 << 2 << 3 << 4 << 5 << 6; 

Я не знаю, если такой подход может иметь некоторые непредвиденные недостатки , поэтому, если вы знаете о некоторых, пожалуйста, делите их!

+1

Наследование со стандартных контейнеров имеет некоторые недостатки ... (conf. My answer). Вы считаете, что вместо этого выполняете бесплатные функции? 'DynamicArray & operator << (const DynamicArray & arr, const T & value)' – log0