std::enable_if在Visual Studio 2013中没有正常工作
std::enable_if not working as expected in Visual Studio 2013
我正在用c++编写一个小库,我只希望模板在算术类型上被实例化,我发现了以下问题:
如果我有以下Foo
的定义:
template<typename T, typename Enable = void>
class Foo;
template<typename T>
class Foo<T, std::enable_if<std::is_arithmetic<T>::value>::type> {
Foo() = default;
Foo( const Foo& ) = default;
~Foo() = default;
template<typename U>
Foo( std::initializer_list<U> list )
{
static_assert(std::is_convertible<U, T>::value, "Must use an initializer list with type convertible to T");
for( std::size_t s = 0; s < 10; ++s )
{
tArray[s] = static_cast<U>(list[s]);
}
}
private:
T tArray[10];
};
我试着这样初始化它:
int main()
{
Foo<int> test{ {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} };
return 0;
}
我得到以下错误:
Foo<T, std::enable_if<std::is_arithmetic<T>::value>::type>::Foo( std::initializer_list<U> )
[与T=int
,U=int
]不可达
我是新的使用std::enable_if
在TMP,但根据cppreference.com看来,这应该工作。我在这里错过了什么,或者这是VS2013的一个bug ?
你的初始化器被声明为private。将其声明为公共的。当使用std::enable_if<>::type
时,不要忘记添加typename
。
编辑:std::initializer_list
中没有下标重载
template<typename T, typename Enable = void>
class Foo;
template<typename T>
class Foo<T, typename std::enable_if<std::is_arithmetic<T>::value>::type> {
public:
Foo() = default;
Foo( const Foo& ) = default;
~Foo() = default;
template<typename U>
Foo( std::initializer_list<U> list )
{
static_assert(std::is_convertible<U, T>::value, "Must use an initializer list with type convertible to T");
for( std::size_t s = 0; s < 10; ++s )
{
// ERROR
// tArray[s] = static_cast<U>(list[s]);
}
}
private:
T tArray[10];
};
这与enable_if
无关。在类开始时没有指定任何成员访问控制,默认情况下,class
成员(与struct
成员相反)是private
。只需将public:
放在类成员声明之前。
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 为什么STD ::计数将常数传递给Lambda,而不是在弦上工作时而不是字符
- C++程序已停止工作-求解常微分方程