base
保護されたコンストラクターなどを含む、保護されたインターフェイスを持つクラス(今のところ呼び出しましょう)があります。一部の関数は、値によってbase
のインスタンスを返します。base
class base {
protected:
base() {}
base (base const &other) {} // line 6
base foo () {
base ret;
return ret;
}
};
これらの関数は派生クラスでラップされ、次のように派生型を返します。
class derived : public base {
private:
derived(base const &b) : base(b) {}
public:
derived() : base() {}
derived foo() {
derived d(base::foo()); // line 21
return d;
}
};
base
戻り値の型から戻り値の型への変換を容易にするために、これを処理derived
するプライベート コンストラクターを提供しderived
ます。
Centos 5.8 で gcc 4.1.2 を使用してこれをコンパイルすると、次のエラーが発生します。
test.cpp: In member function ‘derived derived::foo()’:
test.cpp:6: error: ‘base::base(const base&)’ is protected
test.cpp:21: error: within this context
Linux Mint 12 で gcc 4.6.1 および clang 2.9 を使用すると、コードは、のコピー コンストラクターに対する警告を-Wall -Wextra
除いて、を使用してもファイルをコンパイルします。unused parameter
base
これは gcc 4.1.2 のコンパイラのバグである可能性があると思いますが、ネット上で何も見つけることができませんでした。誰もこれを見たことがありますか?
多大な苦痛なしにコンパイラを更新することはできません。基本クラスのコピー コンストラクターを公開する以外に簡単な回避策はありますか?
EDITbase b;
の 21 行目の前に追加しましたderived::foo()
。その場合、gcc 4.6.1 と gcc 4.1.2 はデフォルトの ctorbase
が保護されていると文句を言い、clang 2.9 は警告なしでコンパイルします。これは、David Rodríguez - dribeas がコメントで述べたことです - デフォルトの ctor は、 の別のインスタンスで呼び出すことはできませんbase
。
EDIT 2ここで適用されると思われる標準段落は 11.5 [class.protected] です。gcc 4.1.2 は私のコードを間違っているとして拒否する点で正しいようですが、なぜ gcc 4.6.1 と clang がそれを許可しているのか疑問に思います。予備的な解決策については、私自身の回答を参照してください。