c++ - 使用指针作为返回类型实现模板化接口的功能->冲突返回类型错误
问题描述
我目前正在学习 C++,并且遇到了以下问题:我有一个模板化接口 BaseTemplate,我想在子类中实现它而不使子类本身成为模板。示例代码如下:
template <typename T>
class BaseTemplate
{
public:
virtual const T get() const = 0;
};
class Child : public BaseTemplate<int*>
{
public:
Child(int value) : myInt{value} {};
virtual const int* get() const override { return &myInt; };
private:
int myInt{0};
};
int main()
{
Child myChild = Child(10);
std::cout << myChild.get() << "\n";
return 0;
}
GCC 产生以下错误:
main.cpp|16|error: conflicting return type specified for ‘virtual const int* Child::get() const’
main.cpp|9|note: overridden function is ‘const T BaseTemplate<T>::get() const [with T = int*]’
我清楚地知道该错误与此有关,
virtual const int* get() const override { return &myInt; };
但我不明白问题出在哪里。如果我将返回类型(当然在两个类中)更改为int
,即返回一个值而不是指针,它可以正常工作。那么这里的指针有什么问题?
也许它有帮助:在我的实际代码中,我想返回一个指向自定义接口而不是 int 的指针,我相信那里的错误是相关的
file_trees.h|19|error: invalid covariant return type for ‘virtual const IDirectoryNode* FileTree::DepthFirstIterator::getCurrent() const’
iterator_interface.h|10|note: overridden function is ‘const T IIterator<T>::getCurrent() const [with T = IDirectoryNode*]’
解决方案
它必须归因于如何const
适用于类型。
const T
意味着返回的值是常数(这当然几乎没用)。对于指针,这意味着指针本身是常量,而不是它的目标。
另一方面,const int*
是一个指向const int
值的非常量指针。
For Base<int*>
, T=int*
yield int* const
, not const* int
,所以你必须定义int* const get()
虚方法。
因为T=const int*
它会const int* const
。有关更多详细信息,请参阅此问题。
推荐阅读
- java - 使用 Optional.ofNullable() 简化条件
- haskell - 如何对具有重复键的元组的键/值列表中的值求和?
- c++ - 我可以在没有首先默认构造所述成员的情况下将参数放入类成员中吗?
- python - 使用 Tkinter 显示多个视频
- wordpress - 发布内部链接时 Elementor 与 buddypress 发生冲突
- tkinter - 如何关闭 Treeview 并恢复到我的主窗口?
- java - 使用java解决车辆路线问题时如何解决运行时问题而不得到结果
- node.js - 将用户卡保存在 Square Payments 中
- python - 存储和保存大量 Keras 模型的最有效方法是什么?
- node.js - 如何从nodejs中的html元素获取引用?