我很难弄清楚我应该如何进行模板特化。不幸的是,这一次谷歌和 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
我应该如何对 derived 进行专门化,以便 getInt() 返回 mValue ?像这样的东西:
template<>
int derived<int>::getInt() { return mValue; }
这是行不通的。
更清楚地说,当我调用 arg->getInt() 时,我希望 pe 输出 23 以及当我调用 arg->getInt() 时在基类中抛出的异常。 你能给我一个示例代码吗?谢谢。
最佳答案
derived
模板没有 getInt()
方法。您无法专门化不存在的东西。
您必须专门化整个模板。试试这个:
template<>
class derived<int> : public base
{
public:
derived() {}
derived(int value) { mValue = value; }
int getInt() override { return mValue; }
private:
T mValue;
};
关于c++ - 在派生模板类中专门化方法形式基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36664159/