【发布时间】:2014-11-09 23:35:51
【问题描述】:
我正在尝试在构造函数上执行 SFINAE。我想为整数启用一个重载,为其他所有内容启用一个重载。我知道我可以创建一个 base(int) 和 base(T) 构造函数,但我想这样做。
template <class T>
struct base
{
template <class T1 = T>
base(T1, typename std::enable_if<std::is_same<T1, int>::value>::type* = nullptr) {}
template <class T1 = T>
base(T1, typename std::enable_if<!std::is_same<T1, int>::value>::type* = nullptr) {}
};
然后我创建一个主要的Base 类来继承构造函数:
template <class T>
struct Base : base<T>
{
using base<T>::base;
};
但是当我用任何T 实例化Base 时,我得到了这些错误:
source_file.cpp:21:15: error: call to deleted constructor of 'Base<int>'
Base<int> v(4);
^ ~
source_file.cpp:16:25: note: deleted constructor was inherited here
using base<T>::base;
^
source_file.cpp:7:5: note: constructor cannot be inherited
base(T1, typename std::enable_if<std::is_same<T1, int>::value>::type* = nullptr) {}
^
当我直接实例化base 时,它可以正常工作。为什么我在做SFINAE的时候不能继承构造函数?如果没有第二个构造函数重载,一切正常。
【问题讨论】:
-
错误消息指的是
base_impl,但您的来源没有提供它 - 只是复制和粘贴问题? (即base在您的实际代码中命名为base_impl吗?) -
@sfjac 我只是稍微更改了名称。
base实际上是base_impl。 -
继承构造函数break really badly with SFINAE using default arguments。只是......不要这样做。
-
@T.C.谢谢。这很糟糕,因为我认为我的情况需要它们。