【发布时间】:2018-04-08 19:27:41
【问题描述】:
我想有条件地禁用某些模板类的复制构造函数。换句话说,如果基类型不可复制构造,我想禁用复制构造函数。为了解决这样的问题(出于教育目的),我决定编写以下程序。 (这里是ideonehttps://ideone.com/QY0NHJ的链接)下面是我的程序源代码:
#include <algorithm>
#include <type_traits>
using namespace std;
template <typename Data>
class Container
{
public:
typedef Container<Data> self_type;
Container():
m_data()
{
}
Container(const typename
std::enable_if<std::is_copy_constructible<Data>::value,
self_type>::type& other_data) :
m_data(other_data.m_data)
{
}
Container(self_type&& other)
{
std::swap(m_data, other.m_data);
}
private:
Data m_data;
};
class SomeData
{
public:
SomeData(){}
SomeData(const SomeData&) = delete;
};
int main()
{
Container<SomeData> container;
return 0;
}
但是来自编译器的消息真的让我很困惑:
prog.cpp:在“类容器”的实例化中: prog.cpp:41:22: 从这里需要 prog.cpp:17:2:错误:“struct std::enable_if >”中没有名为“type”的类型 Container(const typename std::enable_if::value
据我了解,它应该导致 SFINAE,编译器不应该产生任何东西。我哪里错了?
【问题讨论】: