c++ - 非标量类型子类错误

标签 c++ class subclass

我一定生活在一个奇怪的 C++ 版本中。在我的代码的一部分中,我有:

TemplateIterator<sf::Sound> Temp;
TemplateIteratorNonConst<sf::Sound> Temp2 = Temp;

忽略“常量”命名约定,因为 TemplateIteratorNonConst 目前与 TemplateIterator 没有任何不同。我收到错误:

'TL::TemplateIterator<sf::Sound>' to non-scalar type 'TL::TemplateIteratorNonConst<sf::Sound>' requested

这意味着 C++ 存在转换问题。令人难以置信的事实是,TemplateIteratorNonConst 是一个空的子导数,与 TemplateIterator[1] 完全相同:

//Empty to demonstrate the absurdity of the error
template<typename TemplateItem>
class TemplateIteratorNonConst : public TemplateIterator<TemplateItem>
{
private:
protected:
public:
};

即使我定义了赋值运算符(无论是哪种类型 - TemplateIterator 到 NonConsts,反之亦然,相同等),它也没有区别,它会发出相同的错误。如果不是因为以下事实,这不会是一个如此令人困惑的错误:

TemplateIterator<sf::Sound> Temp;
TemplateList<sf::Sound> Temp2 = Temp; //A sub-class of TemplateIterator

绝对不会产生任何错误。为什么 TemplateList(TemplateIterator 的子类)在完全相同的场景中没有收到“非标量类型”警告,而 TemplateIteratorNonConst(也是 TemplateIterator 的子类(和精确的欺骗))却收到了?

由于本页上 TemplateIterator 和 TemplateList 的长度,我无法提供完整的代码示例,并且我无法使用简单的类复制错误(精确重复的子类在执行分配时也不会给出错误)方式)。

为什么会发生此错误,并且没有静态类型转换(鉴于 TemplateList 不需要类型转换即可工作,而 TemplateIteratorNonConst 是 TemplateIterator 的不言自明的重复,因此没有必要)如何我要解决这个问题吗?

(我觉得静态类型转换掩盖了底层的一个更主要的问题,所以我宁愿解决它)。

[1]好吧,对于学究来说可能不是“精确”的重复(它是 TemplatorIterator 的子类),但你知道我的意思。

最佳答案

父类(super class)型不能隐式转换为每种子类型之一。所以我对它不适用于 TemplateIteratorNonConst 并不感到惊讶。如果它适用于 TemplateList,最可能的原因是 TemplateList 有一个采用 TemplateIterator 的构造函数。

请注意

TemplateList<sf::Sound> Temp2 = Temp;

不使用赋值运算符,它尝试使用构造函数,就像

TemplateList<sf::Sound> Temp2(Temp);

附加要求是构造函数不能是隐式的。

要解决您的问题,您必须执行以下任一操作

  • 提供 TemplateIteratorNonConst(TemplateIterator<TemplateItem> const&);在 TemplateIteratorNonConst 中

  • 提供 operator TemplateIteratorNonConst<TemplateItem>();在 TemplateIterator 中。

如果您同时控制两者,第一个选项可能是最好的。

关于c++ - 非标量类型子类错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12109990/

相关文章:

Python:如何使用类方法子类化一个类

iphone - 检测何时按下自定义 UIButton

c++显示虚数部分为i的复数

c++ - QTableView 中选中的行,复制到 QClipboard

c++ - 类和队列

苹果或水果的 C# 类?

python - 什么时候在 Python 中初始化类变量?

java - 我可以为动态数组列表父类(super class)类型对象创建子类对象吗?

c++ - SDL2 SDL_CreateRenderer 降级OpenGL 上下文,是否可以阻止?

c++ - 将 const 引用传递给 C++ 中的临时字符串对象是否安全?