継承可能なコンストラクターはまだg++で実装されていないため、それらの動作を模倣しようとしています。
https://stackoverflow.com/a/5411992/234261で説明されている手法を試しましたが、独自のコンストラクターを追加したいときに問題が発生します。具体的には、特殊なコピーコンストラクターを追加し、他のすべてのコンストラクターを継承しようとしています。残念ながら、継承された、より一般的なコピーコンストラクターが常に代わりに呼び出されます。
例
#include <iostream>
struct A {
A(){}
A(const A &){ std::cout << "IN A" << std::endl; }
};
struct B : public A{
template<typename ...Args,
typename = typename std::enable_if
<
std::is_constructible<A, Args...>::value
>::type>
B(Args &&...args)
: A(std::forward<Args>(args)...) {}
// These don't work either.
//B(const A &a):A(a){ std::cout << "IN B-A" << std::endl; }
//B(const B &b):A(b){ std::cout << "IN B-B" << std::endl; }
};
template<>
B::B(const A &a):A(a){ std::cout << "IN B-A" << std::endl; }
template<>
B::B(const B &b):A(b){ std::cout << "IN B-B" << std::endl; }
int main(){
A a; // 1. Prints nothing as expected
B b(a); // 2. Prints "IN A" only
B b1(b); // 3. Prints "IN A" only
return 0;
}
[3]でINA、次にINBBを印刷したいと思います。どういうわけか、実際のコードで[2]を機能させることができましたが、何らかの理由でこの小さな例では繰り返すことができません。
サブクラス(B)を実際に使用してスーパークラス(A)を構築できるため、テンプレートコンストラクターが作成されていることを理解しています。
しかし、なぜ私の明示的なスペシャライゼーションが呼び出されないのですか?私は間違って専門化していますか?もっと良い方法はありますか?
誰かがそれを実行したい場合は、この例にリンクしてくださいhttp://ideone.com/eUHD5
gcc4.6を使用しています