2017-10-12 10 views
0

私は2つのテンプレートクラスCarOwnerTruckを持っています。C++は、異なるテンプレートクラスのenumを関数パラメータとして使用します。

// CarOwner.h 
#include "Truck.h" 
template<size_t T1, typename T2> 
class CarOwner { 
public: 
    enum MyEnum { 
     red = 0, 
     green 
    } 

    void DoSomething(); 

private: 
    Truck<DataContainer<T1,T2>> truck_; 
    MyEnum color; 
} 

// CarOwner.hpp 
template<size_t T1, typename T2> 
void CarOwner<T1,T2>::DoSomething(){ 
    this->truck_.setEnum(this->color); 
} 

// Truck.h 
template<typename G> 
class Truck { 
    void setEnum(CarOwner<T1,T2>::MyEnum color); // <--- 
} 

私の問題は、関数宣言の記述方法を理解することです。void setEnum();です。上記のコードに示されているように、私は実際にはCarOwner<T1,T2>::MyEnum color型の列挙型関数を渡したいと思います。 CarOwner#include "Truck.h"が必要なので、TruckクラスにCarOwnerを含めることはできません。さらに、テンプレートパラメータT1およびT2は、異なるテンプレートタイプGを持つので、クラスTruckの中では不明です。

CarOwner<T1,T2>::MyEnumを受け入れるようにこの関数を正しく宣言する方法がありません。どんな助けもありがとう!

編集: テンプレートパラメータGT1T2の組み合わせです。

このコードは、私の問題を示す単なる例であり、デザインは明らかに奇妙です。

+0

これは奇妙なデザインのようです。なぜ車の所有者*は色を持っていますか? –

+0

'DoSomething'はまず' CarOwner'本体で宣言しなければなりません。 'Truck truck_;'は 'Truck'がテンプレートであるため動作しませんので、' G'を余分な 'CarOwner'テンプレートパラメータとして渡す必要があります。 'setEnum'もテンプレートである必要があります。 – VTT

+0

ヒントのおかげで。私は本当に 'CarOwner'に余分なテンプレートパラメータを追加することを避けたいと思います。どういうわけか、 'CarOwner'を' Truck'で宣言することはできないでしょうか? – DummySenior

答えて

0

トラックがTruck<DataContainer<T1,T2>>としてインスタンス化され、あなたは部分的特殊化を書くことができると仮定すると:

template<typename G> 
class Truck { 
    // whatever 
}; 

template<typename T1,typename T2> 
class CarOwner; 

template<typename T1, typename T2> 
class Truck<DataContainer<T1,T2>> { 
    void setEnum(typename CarOwner<T1,T2>::MyEnum color); 
}; 

代わりに、あなたは、たとえば、OWNERTYPEをsetEnumを超えるテンプレート化できます

template<typename G> 
class Truck { 
    template<typename OwnerType> 
    void setEnum(typename OwnerType::MyEnum color); 
}; 

// ... 

void CarOwner<T1,T2>::DoSomething(){ 
    this->truck_.template setEnum<CarOwner<T1,T2>>(this->color); 
} 

か...

+0

setEnumをテンプレート化できるかどうかわかりませんでした!本当にありがとう、魅力のように動作します! – DummySenior

関連する問題