2017-06-30 2 views
0

、ノーC++テンプレートの第一人者だと正しい操作を行ってくださいカスタムアロケータcompatibilty

could not convert ‘bar’ from ‘std::vector<int, CustomAlloc<int, [...] >}’ to ‘std::vector<int>’ 

std::vector<int, CustomAlloc>結果のインスタンスを持つFOOを呼び出しますもし私が間違っているのであれば、私の理解はstd::vector<int>がデフォルトでstd::vector<int, std::allocator<int> >(gcc 7.1.1.-3)になっており、したがって完全に無計画のタイプを定義しています。


これは私がfoo呼び出し可能std::vector<int, CustomAlloc>を使用して、次に付属させるためにいくつかの解決策を見つけようとしていますと述べたbeeingて。

template<typename Allocator> 
void foo(std::vector<int, Allocator> &bar); 

私はアロケータ仕様はテンプレートを伝播する方法を嫌い、私はそれはSTLがどのように動作するかだと思います。

私の質問は、fooが具体的にはintで動作しているので、この問題をどのように解決しますか?

PS:私はちょうどこの問題を解決するための標準で全く新しい名前空間がある良いもの

+0

異なるタイプのパラメータを取るために 'foo'が必要なのかどうかは不明ですが、' CustomAlloc'だけを使用する必要がある場合は 'void foo(std :: vector &bar);'テンプレートなしで。 –

答えて

2

を見つけることができなかった悪いタイトルのために謝罪 - namespace pmrが。 polymorphic_allocator: when and why should I use it?

pmrソリューションを使用しないテンプレートでこの問題が伝播するのを防ぐためにできることは次のとおりです。答えはあなたができないことです。アロケータパラメータを厳密に指定する必要があります。あるいは、任意のタイプのアロケータを受け入れるようにベクターをテンプレートする必要があります。

+1

ありがとう、これは有望に見えて、この問題の優雅な解決策を提案します。 – dna

関連する問題