2016-07-20 9 views
2

関数の引数のテンプレートを作成したいと思います。カスタムメモリアロケータ付きstd :: vector用のC++テンプレート

引数はアロケータ付きのstd::vector<type>です。

デフォルトでは、デフォルトのメモリアロケータが使用されますが、カスタムアロケータも使用できます。

次のコードは機能しません。これを修正するには?

template <typename T, typename T2=std::allocator<T>> 
void pad_zero(std::vector<T,T2> vec, uint32_t n){ 
    uint32_t i; 
    for (i = 0; i < n; i++){ 
     vec.push_back(0); 
    } 
} 

ありがとうございます。

+0

http://coliru.stacked-crooked.com/a/3ad139c309b53f99。 '= std :: allocator 'は必要ありません。 – LogicStuff

+1

どのように動作しませんか?ローカル変数 'vec'のみを変更します。 – KIIV

+0

intel cコンパイラとgccの両方がテンプレート<...>内に<>を使用していると文句を言います。問題は、2番目のテンプレート引数が1番目のテンプレート引数に依存するようです。 – rxu

答えて

4

アロケータのデフォルトを指定する必要はありません。しかし実際には問題は、あなたがローカル変数を埋めていることです - vecによってで受け入れます!

参考にして、不要なデフォルトを削除してください。また、正確に何をしたいんinsert()の過負荷、(による再配分の不確実な数に冗長ですが非効率ではないだけである)必要なループなしマニュアルがあります:

template <typename T, typename A> 
void pad_zero(std::vector<T,A>& vec, uint32_t n) { 
//       ^^^ 
    vec.insert(vec.end(), n, T{0}); 
} 
2

あなたが提供する必要はありません。アロケータ、テンプレート引数の減算がそれを行います。

あなたは値によって、あなたのベクトルを渡していることに加えて注意、オリジナルのものは変わらないながら、あなたが

探しているものはおそらくされていない、ベクトルのコピーを得るpad_zero内側になるよう

:出力

#include <iostream> 
#include <vector> 

template <typename T, typename A> 
void pad_zero(std::vector<T,A>& vec, uint32_t n) 
{ 
    uint32_t i; 
    for (i = 0; i < n; i++) 
    { 
     vec.push_back(0); 
    } 
} 

int main() 
{ 
    std::vector<int> a = { 1, 2, 3 }; 
    pad_zero(a, 10); 

    for (int i : a) 
     std::cout << i << '\n'; 
} 

http://coliru.stacked-crooked.com/a/5457167a4aeb36db

以下のコードを参照してください。
1 
2 
3 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
関連する問題