我有以下代码示例(已编译MSVC 2015)
https://godbolt.org/g/kccgtb(用于可执行演示)
#include "boost/range/value_type.hpp"
namespace foo {
template <typename Range>
typename boost::range_value<Range>::type
operator|(Range const& r, int holder)
{
}
}
using namespace foo;
int main(){
}
在msvc下会产生以下错误
example.cpp
/opt/compiler-explorer/windows/19.00.24210/include/xlocale(341): 警告C4530:使用了C ++异常处理程序,但展开语义是 未启用。指定/ EHsc
/opt/compiler-explorer/libs/boost_1_67_0\boost/range/value_type.hpp(26): 错误C2039:“类型”:不是以下成员 'boost :: range_iterator'
with [ T=unsigned __int64 ]
/opt/compiler-explorer/libs/boost_1_67_0\boost/range/value_type.hpp(26): 注意:请参见“ boost :: range_iterator”的声明
with [ T=unsigned __int64 ]
/opt/compiler-explorer/windows/19.00.24210/include/xstring(1659): 注意:请参阅对类模板实例化的参考 正在编译“ boost :: range_value”
/opt/compiler-explorer/windows/19.00.24210/include/xstring(1658): 注意:在编译类模板成员函数'void std :: basic_string,std :: allocator> :: shrink_to_fit(void)'
/opt/compiler-explorer/windows/19.00.24210/include/system_error(661): 注意:请参见对功能模板实例化的参考 std :: basic_string,std :: allocator> :: shrink_to_fit(void)' 正在编译
/opt/compiler-explorer/windows/19.00.24210/include/stdexcept(21): 注意:请参阅对类模板实例化的参考 'std :: basic_string,std :: allocator>' 正在编译
/opt/compiler-explorer/libs/boost_1_67_0\boost/range/value_type.hpp(26): 错误C2146:语法错误:标识符'type'之前缺少'>'
/opt/compiler-explorer/libs/boost_1_67_0\boost/iterator/iterator_traits.hpp(23): 错误C2039:“ value_type”:不是以下成员 'std :: iterator_traits'
with [ Iterator=int ]
/opt/compiler-explorer/libs/boost_1_67_0\boost/iterator/iterator_traits.hpp(23): 注意:请参见“ std :: iterator_traits”的声明
with [ Iterator=int ]
/opt/compiler-explorer/libs/boost_1_67_0\boost/range/value_type.hpp(27): 注意:请参阅对类模板实例化的参考 正在编译“ boost :: iterators :: iterator_value”
/opt/compiler-explorer/libs/boost_1_67_0\boost/iterator/iterator_traits.hpp(23): 错误C3646:“类型”:未知的覆盖说明符
/opt/compiler-explorer/libs/boost_1_67_0\boost/iterator/iterator_traits.hpp(23): 错误C4430:缺少类型说明符-假定为int。注意:C ++不会 支持default-int
编译器返回:2
在gcc和clang下进行编译。
答案 0 :(得分:3)
一种方法是在模板参数内使用SFINAE:
template <class Range, class = std::enable_if_t<!std::is_fundamental_v<Range>>>
typename boost::range_value<Range>::type
operator|(
const Range &r
, int holder)
{
}
它比带有sfinae参数的人更简洁,更不模糊
答案 1 :(得分:1)
我在一个办公室里工作。这很丑,但似乎可以工作
+----------+----------+-------+----------+
| arrivalDt| bookingDt|vyge_id|txnDt |
+----------+----------+-------+----------+
|2018-01-05|2018-01-01| 1000|2018-01-01|
+----------+----------+-------+----------+
|2018-01-05|2018-01-01| 1000|2018-01-02|
+----------+----------+-------+----------+
|2018-01-05|2018-01-01| 1000|2018-01-03|
+----------+----------+-------+----------+
|2018-01-05|2018-01-01| 1000|2018-01-04|
+----------+----------+-------+----------+
|2018-01-05|2018-01-01| 1000|2018-01-05|
+----------+----------+-------+----------+