我有以下用例,但我无法弄清楚如何使其工作:
enum MyTemplateEnum { A, B };
template<MyTemplateEnum T = A>
class MyTemplateClass<T> {
// ...
};
std::string argument = ...;
std::auto_ptr<MyTemplateClass<> > instance;
if (argument == "a") {
std::auto_ptr<MyTemplateClass<A> > temp(new MyTemplateClass<A>(...));
instance = temp;
} else
if (argument == "b") {
std::auto_ptr<MyTemplateClass<B> > temp(new MyTemplateClass<B>(...));
instance = temp;
}
这会导致编译错误,因为我基本上无法将具体实现std::auto_ptr<MyTemplateClass<A> >
分配给通用版本std::auto_ptr<MyTemplateClass<> >
。
答案 0 :(得分:2)
您需要为MyTemplateClass<T>
模板的所有实例化提供公共基类。否则所有的实例都是不相关的类。
class MyTemplateBase {
public:
// Don't forget virtual destructor.
virtual ~MyTemplateBase() {}
};
template<typename T = A>
class MyTemplateClass : public MyTemplateBase {
};
std::auto_ptr<MyTemplateBase> instance;
if (argument == "a") {
instance.reset(new MyTemplateClass<A>(...));
} else if (argument == "b") {
instance.reset(new MyTemplateClass<B>(...));
}
请注意std::auto_ptr
已过时。如果可能,请改用std::unique_ptr
或boost::scoped_ptr
。