【发布时间】:2017-05-27 08:43:19
【问题描述】:
代码如下。看起来很简单,但是会出现一些我找不到错误的编译错误。
#define ENABLE_IF(Condition, Type) typename enable_if < (Condition), Type>::type
template<size_t I = 0, class... Ts>
ENABLE_IF(I == sizeof...(Ts), void) read(QDataStream& in, tuple<Ts...>& t)
{}
template<size_t I = 0, class... Ts>
ENABLE_IF(I < sizeof...(Ts), void) read(QDataStream& in, tuple<Ts...>& t)
{
in >> std::get<I>(t);
read<I + 1>(in, t);
}
lat 语句错误:error C2770: invalid explicit template argument(s) for 'enable_if<I<0x01,void>::type read(QDataStream &,std::tuple<_Types1...> &)'
经过多次测试,发现下面的代码是可以的
template<size_t I = 0, class Tuple>
ENABLE_IF(I == tuple_size<Tuple>::value, void) read(QDataStream& in, Tuple& t)
{}
template<size_t I = 0, class Tuple>
ENABLE_IF(I < tuple_size<Tuple>::value, void) read(QDataStream& in, Tuple& t)
{
in >> std::get<I>(t);
read<I + 1>(in, t);
}
这使用元组类型作为模板参数,而不是其元素类型包。是什么原因? VS2013 的编译错误?
用其他编译器测试。原代码没问题。我认为这是一个 VS2013 错误。 :-(
【问题讨论】:
-
@Jefffrey 你的模板实例化在哪里?
-
42 岁时可以生育(但不鼓励女性生育)
-
@sehe 我还没有 42 岁,但这个笑话适用于任何一种方式:)。