C ++使用来自不同模板类的枚举作为函数参数

时间:2017-10-12 08:43:21

标签: c++ templates enums

我有两个模板类CarOwnerTruck

// 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,我无法在CarOwner课程中加入Truck。此外,模板参数T1T2在类Truck中未知,因为它具有不同的模板类型G

我不知道如何正确声明此函数以接受CarOwner<T1,T2>::MyEnum。任何帮助表示赞赏!

修改 模板参数GT1T2的组合。

这段代码只是一个说明问题的例子,设计显然很奇怪。

1 个答案:

答案 0 :(得分:0)

假设Truck被实例化为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);
}

或......