非标量类型子类错误

时间:2012-08-24 13:05:50

标签: c++ class subclass

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

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

忽略'constness'命名约定,因为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的子类),但是你知道我的意思。

2 个答案:

答案 0 :(得分:1)

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

请注意

TemplateList<sf::Sound> Temp2 = Temp;

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

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

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

要解决您的问题,您必须

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

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

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

答案 1 :(得分:1)

你应该有一个

TemplateIteratorNonConst::TemplateIteratorNonConst(const TemplateIterator<T>& other)

构造函数和一个

TemplateIteratorNonConst::operator=(const TemplateIterator<T>& other)

TemplateIteratorNonConst过载TemplateIterator<T>