我试图模仿可继承构造函数的行为,因为它们尚未在 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] 打印IN A然后IN BB。不知何故,我设法让 [2] 在我的实际代码中工作,但由于某种原因不能在这个小例子中重复它。
我知道由于子类(B)实际上可以用于构造超类(A),因此正在创建模板构造函数。
但是,为什么我的显式特化没有被调用?我是不是专业不正确?有没有更好的办法?
如果有人想运行它,请链接到此示例http://ideone.com/eUHD5
我正在使用 gcc 4.6