2017-10-12 94 views
0

我有兩個模板類CarOwnerTruckC++使用來自不同模板類的枚舉作爲函數參數

// 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的枚舉。因爲我需要#include "Truck.h"在類CarOwner,我不能在Truck類包括CarOwner。此外,模板參數T1T2在類Truck內部是未知的,因爲它具有不同的模板類型G

我不知道如何正確聲明這個函數來接受CarOwner<T1,T2>::MyEnum。任何幫助表示讚賞!

編輯: 模板參數GT1T2的組合。

這段代碼只是一個例子來說明我的問題,而且設計顯然很奇怪。

+0

這似乎是一個奇怪的設計。爲什麼車主*會有顏色? –

+0

'DoSomething'必須先在'CarOwner'體中聲明。 'Truck truck_;'不會工作,因爲'Truck'是一個模板,所以您需要將'G'作爲額外的'CarOwner'模板參數傳遞。 'setEnum'也需要成爲一個模板。 – VTT

+0

感謝提示。我真的想避免爲'CarOwner'添加額外的模板參數。難道不可能以某種方式向卡車中宣佈CarOwner? – 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); 
}; 

或者,你可以在模板化setEnum,比方說,OwnerType:

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

我甚至不知道你可以templatize setEnum!非常感謝你,像一個魅力! – DummySenior