我试图根据传递的输入类型自动选择一个构造函数,同时还避免了手动编写类模板参数的麻烦。
template <typename T>
class A {
public:
static constexpr bool isP = std::is_pointer_v<T>;
template <typename = std::enable_if_t<isP>>
A(T t) {
std::cout << (*t) << '\n';
}
template <typename = std::enable_if_t<!isP>>
A(T t) {
std::cout << t << '\n';
}
};
这不起作用,并且失败:
test.cpp:18:9: error: ‘template<class T> template<class> A<T>::A(T)’ cannot be overloaded
A(T t) {
^
test.cpp:13:9: error: with ‘template<class T> template<class> A<T>::A(T)’
A(T t) {
^
This question解决了类似的情况,即需要有条件地编译两个成员函数。同时,我在推导构造函数时推导出模板参数,因此我不确定该过程应该如何进行。
即使尝试应用通用解决方案也给了我一个奇怪的结果。如果我使用类似的东西:
template <bool x = isP, typename = std::enable_if_t<x>>
在两个构造函数之一中,然后我的代码成功编译(g++7.2.0
)。但是,如果我在两者上都使用它,例如:
template <typename T>
class A {
public:
static constexpr bool isP = std::is_pointer_v<T>;
template <bool x = isP, typename = std::enable_if_t<x>>
A(T t) {
std::cout << (*t) << '\n';
}
template <bool x = !isP, typename = std::enable_if_t<x>>
A(T t) {
std::cout << t << '\n';
}
};
它再次失败!
为什么会发生这种情况,为什么当我仅在两个构造函数之一上使用此技巧时,它为什么会起作用?