5

是否有可能在沒有專門化的情況下在std容器上使用typedef?標準容器模板typedef(沒有專業化)?

這樣的代碼工作:

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 2012-04-27 14:07:09

+0

@suszterpatt - 真,但我儘量保持現代,避免使用不安全的宏:) – dtech 2012-04-27 14:19:14

回答

9

是的,在C++ 11中。

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

(不是說你應該使用這個確切的別名)。

+0

它似乎並沒有在Visual Studio 2010 SP1中工作。我得到「無法識別的模板聲明/定義」 我想它不支持MS呢? – dtech 2012-04-27 13:55:56

+1

@ddriver:不,它不是。而不是VC11,AFAIR。如果你想要C++ 11,可以使用GCC或Clang。 – 2012-04-27 13:58:14

+0

我通過簡單地繼承向量找到了VS的解決方法。如果這不是一個好主意,請參閱我添加的答案並提供一些信息。謝謝! – dtech 2012-04-27 15:03:47

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>; 

否則(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; 
} 
+0

是的,但是爲什麼我會在內部使用動態內存分配來爲其數據動態分配向量? – dtech 2012-04-27 15:31:33

+0

另外,我不能自己寫一個析構函數,我認爲向量的析構函數應該對其數據負責,我只需要照顧我添加的額外的東西。我可能錯了,我對C++不太瞭解。 – dtech 2012-04-27 15:35:48

+0

我的意思是,可以肯定的是,多態使用可能會出現問題,但由於意圖是僅使用派生類,所以我認爲由於缺少虛擬析構函數而不會有任何問題。我的意思是它不像我要調用指向vector的指針上的delete,它實際上指向一個DynamicArray,它也沒有額外的動態分配成員來需要額外的照顧。如果我錯了,請糾正我。謝謝! – dtech 2012-04-27 15:48:55

3

該語法在C++中無效,沒有像「template 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; 
}; 
0

將我自己的解決方案添加到組合中

由於Visual Studio不支持C++ 11功能,我決定只是繼承的std ::載體,以此來增加一些功能:

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。我的答案)你是否考慮實現免費函數? 'DynamicArray&operator <<(const DynamicArray&arr,const T&value)' – log0 2012-04-27 15:18:12