3

我有以下用例,但我不知道如何使它工作:

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<> >

4

1 回答 1

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_ptrboost::scoped_ptr代替。

于 2013-09-05T14:07:27.420 回答