为什么“使用命名空间”尝试为MSVC

时间:2018-08-08 10:31:49

标签: c++ templates boost

我有以下代码示例(已编译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下进行编译。

请参见https://godbolt.org/g/kccgtb

2 个答案:

答案 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|
+----------+----------+-------+----------+