我有两个模板类CarOwner
和Truck
。
// 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
。此外,模板参数T1
和T2
在类Truck
中未知,因为它具有不同的模板类型G
。
我不知道如何正确声明此函数以接受CarOwner<T1,T2>::MyEnum
。任何帮助表示赞赏!
修改
模板参数G
是T1
和T2
的组合。
这段代码只是一个说明问题的例子,设计显然很奇怪。
答案 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);
}
或......