2012-05-02 11 views
2

私はカスタムコンテナを使用しようとしています。そのコンテナのコンストラクタでメモリプールアロケータを渡します。 全体のものは、次のように起動します:テンプレートコンテナのコンストラクタを使用する際に問題が発生するC++

AllocatorFactory alloc_fac; 

//Creates a CPool allocator instance with the size of the Object class 
IAllocator* object_alloc = alloc_fac.GetAllocator<CPool>(1000,sizeof(Object)); 
//Creates a CPool allocator instance with the size of the BList<Object> class 
IAllocator* list_alloc = alloc_fac.GetAllocator<CPool>(10,sizeof(BList<Object>)); 
//Same logic in here as well 
IAllocator* node_alloc = alloc_fac.GetAllocator<CPool>(1000,sizeof(BListNode<Object>)); 

IAllocatorクラスには、次のようになります。

class IAllocator 
{ 

public: 

    virtual void* allocate(size_t bytes) = 0; 
    virtual void deallocate(void* ptr) = 0; 

    template <typename T> 
    T* make_new() 
    { return new (allocate(sizeof(T))) T(); } 

    template <typename T, typename Arg0> 
    T* make_new(Arg0& arg0) 
    { return new (allocate(sizeof(T))) T (arg0); } 

      ....... 
} 

とコンテナクラスのコンストラクタは次のようになります。

template <class T> 
class BList { 
...... 
public: 
/** 
*@brief Constructor 
*/ 
BList(Allocators::IAllocator& alloc){ 
    _alloc = alloc; 
    reset(); 
    } 
/** 
*@brief Constructor 
*@param inOther the original list 
*/ 
BList(const BList<T>& inOther){ 
    reset(); 
    append(inOther); 
    } 
..... 
} 

とするとき、私はこれを行います:

BList<Object> *list = list_alloc->make_new<BList<Object>>(node_alloc); 

コンパイラは、この文句:

エラー1つのエラーC2664: 'コンテナ:: BList :: BList(アロケータ:: IAllocator &)': ' 'にアロケータ:: IAllocator *' からパラメータ1を変換することはできませんアロケータ:: IAllocator & 'C:\ licenta \ licenta-transfer_ro-02may-430722 \ licenta \枠組み\枠組み\ iallocator.h 21 Frameworkの

私は、私はこの1つで私の頭の上に行ったと思い....

答えて

3

既存の答えは正しいですが、エラーを自分で読む方法についての簡単なメモ:あなただけの部分に分割する必要が...

Error 1 error C2664: 'Containers::BList::BList(Allocators::IAllocator &)' : cannot convert parameter 1 from 'Allocators::IAllocator *' to 'Allocators::IAllocator &' 

読み取り:

  • IAllocator
  • への参照を取っているコンストラクタであるContainers::BList::BList(Allocators::IAllocator &)を呼び出しています... from 'Allocators::IAllocator *'
  • 、それは(コンストラクタ宣言と一致するように)このタイプを望んでいた:... to 'Allocators::IAllocator &'
  • をは、コンパイラは、あなたがそれをこのタイプを与えてくれた
    • その最初の(そして唯一の)引数の型とのトラブルを抱えていることを意味します

ですから、どのようにしてコンストラクタが参照する参照にポインタを変換しますか?


OK、私も実際の答えを追加しました:

Allocators::IAllocator *node_alloc = // ... 
Allocators::IAllocator &node_alloc_ref = *node_alloc; 
BList<Object> *list = list_alloc->make_new<BList<Object>>(node_alloc_ref); 

か、単に:

BList<Object> *list = list_alloc->make_new<BList<Object>>(*node_alloc); 
+0

+1エラーメッセージを説明するため。 –

+0

すべての答えをありがとう。それらはすべて有効ですが、私は解決策としてマークすることしかできませんので、教育上の価値が高いため、これを選択しました。 –

1

make_newと表示されているようです参照の代わりにterを使用します。試してみてください:

BList<Object> *list = list_alloc->make_new<BList<Object>>(*node_alloc); 

そして、踏み台を拾い、それに固執してください。

0

あなたのアロケータファクトリはアロケータへのポインタを返していますが、あなたのコンストラクタはアロケータへの参照を必要としています。ポインタを逆参照する必要があります。

IAllocator* node_alloc = alloc_fac.GetAllocator<CPool>(1000,sizeof(BListNode<Object>));  

// Instead of: 
// BList<Object> mylist(node_alloc); 
// you need: 
// 
BList<Object> mylist(*node_alloc); 
関連する問題