2017-10-12 134 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