gpt4 book ai didi

c++ - 在派生模板类中专门化方法形式基类

转载 作者:行者123 更新时间:2023-11-30 03:42:45 28 4
gpt4 key购买 nike

我很难弄清楚我应该如何进行模板特化。不幸的是,这一次谷歌和 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com