7

特殊化せずにstdコンテナでtypedefを使用することは可能ですか?

このようなコードは機能します:

typedef std::vector<int> intVector;

しかし、このコードの場合:

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

エラーが発生します:

'typedef'のテンプレート宣言

これはC++で行うことができますか?

4

4 に答える 4

11

はい、C++11 で。

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

(この正確なエイリアスを使用する必要はありません。)

于 2012-04-27T13:48:24.870 に答える
6

コンパイラが c++11 をサポートしている場合:

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

それ以外の場合 (c++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;
}
于 2012-04-27T13:48:28.037 に答える
3

この構文は C++ では無効です。「テンプレート typedef」のような機能はありません。

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

ただし、C++11 では、次のようなテンプレート エイリアス構文が導入されています。

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

C++03 では、次のようなテンプレート メタ関数を使用できます。

template<class T>
struct DynamicArray
{
    typedef std::vector<T> type;
};
于 2012-04-27T13:50:57.483 に答える
2

一般的な解決策 (C++ 11 を使用していない場合) は、次のようにすることです。

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

として使用しますDynamicArray<Something>::Type

于 2012-04-27T13:48:18.390 に答える