2016-10-05 15 views
2

私は、boostのmake_shared()とテンプレートクラスの使用に関する多くの質問/回答があることを知りましたが、C++で全く新しいので、探しているものが見つからないようです。 基本的に私は、GenericManagerというマネージャクラスに以下のpublicメンバを持つGenericというクラスを作成しました。テンプレートクラスを使ったboost :: make_shared()

class GenericManager 
{ 
public: 
typedef boost::shared_ptr<GeneriClass> GenericClassPtr; 
//... more members etc 
}; 

今、私はテンプレートです別のクラスを持っていると私はmake_sharedコールを作成したい、すなわち:

template <class MyType> 
SpecificClass<MyType>::... 
{ 
//class members functions etc 
}; 

、その後、私がやりたいの呼び出しは、次のとおりです。

GenericClassPtr SpecificClassFactory::construct() 
{ 
    return boost::make_shared<SpecificClass>(); 
} 

どのSpecificClassの非テンプレートバージョンでうまく動作しますが、テンプレートバージョンでは通常のエラーが表示されます:

error: no matching function for call to ‘make_shared()’ 

どのようにmake_sharedを呼び出すと、テンプレートタイプを受け入れることができますか?今のところ私はC++ 98に固執しています!

編集:@wasthishelpful修正された誤植が修正されました。

+2

'return boost :: make_shared >();'? – Jarod42

+0

ありがとう@ Jarod42! – nabber

答えて

3

SpecificClassは、テンプレートパラメータを必要とします。

return boost::make_shared<SpecificClass<SomeType> >(); 
// in C++98, do not forget space here   ^^^ 

だからあなたconstruct方法は、いずれかのクラス全体のために、同様に1を持っている必要があります。

template<typename SomeType> 
struct SpecificClassFactory 
{ 
    static GenericClassPtr construct() 
    { 
     return boost::make_shared<SpecificClass<SomeType> >(); 
    } 
}; 

// usage 

GenericManager::GenericClassPtr ptr = SpecificClassFactory<SomeType>::construct(); 

それとも唯一の方法のために:

template<typename SomeType> 
GenericClassPtr SpecificClassFactory::construct() 
{ 
    return boost::make_shared<SpecificClass<SomeType> >(); 
} 

// usage 

GenericManager::GenericClassPtr ptr = SpecificClassFactory::construct<SomeType>(); 

GenericClassのtypedef AY(:「フラットは、ネストされたよりも優れている」Zen of Pythonを参照してください):優れた外クラスの宣言も

class GenericManager 
{ 
public: 
//... more members etc 
}; 

typedef boost::shared_ptr<GeneriClass> GenericClassPtr; 

これは、代わりにGenericManager::GenericClassPtrの、直接GenericClassPtrを呼び出すことができるようになります。

+0

これはとても魅力的ですが、GenericClassはテンプレート化されていないので、MyTypeテンプレートバージョンのGenericClassPtr SpecificClassFactory :: construct()を作成するにはどうしたらいいですか? return boost :: make_shared >を呼び出すことはできますが、boost :: make_shared は呼び出すことができません。私がここで紛失している何か?私は2つの別々のフロート/ダブルバリアントを持つマクロを作成することができますが、それは私が避けようとしていることです! – nabber

+0

@ user3616082あなたのコメントを理解できていません。私は自分の答えを編集し、それが役に立ったら教えてください(または、^^) – wasthishelpful

+0

はい、すべてソートされています。ありがとう!!! – nabber

関連する問題