我很难搞清楚如何制作模板专业化。不幸的是,这次谷歌和SO无法帮助我。
对于基类:
class base
{
public:
virtual ~base() = 0;
virtual int getInt() { throw std::invalid_argument(std::string(typeid(*this).name()) + " can't return int"); }
};
base::~base() {}
和派生类:
template<class T>
class derived : public base
{
public:
derived() {}
derived(T value) { mValue = value; }
private:
T mValue;
};
此代码:
void proof(base* arg)
{
try
{
std::cout << arg->getInt();
}
catch (std::exception& e)
{
std::cout << e.what();
}
std::cout << "\n\n";
}
int main()
{
base* a = new derived<int>(23);
base* b = new derived<std::string>("abc");
proof(a);
proof(b);
delete a;
delete b;
return 0;
}
输出,如果还不是很明显:
class derived<int> can't return int
class derived<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > can't return int
我应该如何对派生进行专门化,所以getInt()会返回mValue?类似的东西:
template<>
int derived<int>::getInt() { return mValue; }
这不起作用。
更清楚的是,当我调用arg-&gt; getInt()时,我希望pe输出23,当我调用arg-&gt; getInt()时,我会抛出基类中的异常。 你能给我一个示例代码吗?谢谢。
答案 0 :(得分:1)
derived
模板没有getInt()
方法。你不能专注于不存在的东西。
您必须专门化整个模板。试试这个:
template<>
class derived<int> : public base
{
public:
derived() {}
derived(int value) { mValue = value; }
int getInt() override { return mValue; }
private:
T mValue;
};
答案 1 :(得分:1)
您可以专门设定int
的模板:
template <> class derived<int> : public base
{
public:
derived(int value) : mValue(value) {}
int getInt() override { return mValue; }
private:
int mValue;
};