2

我一定生活在一个奇怪的 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 的子类),但你知道我的意思。

4

2 回答 2

1

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

请注意,在

TemplateList<sf::Sound> Temp2 = Temp;

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

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

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

要解决您的问题,您必须

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

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

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

于 2012-08-24T13:23:48.873 回答
1

你应该有一个

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

构造函数和一个

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

你的超载TemplateIteratorNonConst需要TemplateIterator<T>

于 2012-08-24T13:24:15.517 回答