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