我一定生活在一个奇怪的 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/