2

私はC++の奇妙なバージョンに住んでいるに違いありません。私のコードのセクションには、次のものがあります。

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

TemplateIteratorNonConstは現在、TemplateIteratorと何ら変わらないため、「constness」の命名規則は無視してください。エラーが発生します:

'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:
};

代入演算子を定義しても(テンプレートIteratorからNonConsts、またはその逆、同じ場合など)、違いはなく、同じエラーが発生します。次の事実がなければ、それほど紛らわしいエラーにはなりません。

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

エラーはまったく発生しません。なぜ、TemplateIteratorのサブクラスであるTemplateListは、まったく同じシナリオで「非スカラー型」の警告を受け取らないのに、TemplateIteratorのサブクラス(および正確な複製)でもあるTemplateIteratorNonConstは受け取るのですか?

このページのTemplateIteratorとTemplateListの両方の長さのため、完全なコード例を示すことはできません。また、単純なクラスでエラーを再現できませんでした(正確に重複するサブクラスは、どちらの方法でも割り当てを実行するときにエラーを発生させません)。

なぜこのエラーが発生し、静的な型キャストがないのですか(TemplateListが機能するために型キャストを必要とせず、TemplateIteratorNonConstはTemplateIteratorの自明の複製であるため、必要ないはずです)どうすれば問題を修正できますか?

(静的型キャストは、下にあるより大きな問題を隠蔽していると感じているので、むしろそれに対処したいと思います)。

[1]さて、衒学者の「正確な」複製(TemplatorIteratorのサブクラス)ではないかもしれませんが、あなたは私が何を意味するか知っています。

4

2 に答える 2

1

スーパータイプは、各サブタイプの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)

コンストラクターと1つ

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

あなたの過負荷はTemplateIteratorNonConstかかりますTemplateIterator<T>

于 2012-08-24T13:24:15.517 に答える