当前位置: 首页 > 知识库问答 >
问题:

为什么“使用命名空间”尝试在MSVC的命名空间中实例化模板

邹俊友
2023-03-14

我有以下代码示例(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下生成以下错误

实例cpp公司

/opt/compiler-explorer/windows/19.00.24210/include/xlocale(341):警告C4530:使用了C异常处理程序,但未启用展开语义。指定/EHsc

/opt/compiler-explorer/libs/boost\u 1\u 67\u 0\boost/range/value\u类型。hpp(26):错误C2039:“type”:不是“boost::range\u迭代器”的成员

    with

    [

        T=unsigned __int64

    ]

/opt/compiler-explorer/libs/boost_1_67_0/range/value_type.hpp(26):注意:请参阅'boost-::range_iterator'的声明

    with

    [

        T=unsigned __int64

    ]

/opt/compiler-explorer/windows/19.00.24210 /include/xstring(1659):注意:请参阅对正在编译的类模板实例化“提升::range_value”的引用

/opt/compiler-explorer/windows/19.00.24210 /include/xstring(1658):注意:在编译类模板成员函数时'ulustd::basic_string, std::allocator

/opt/compiler-explorer/windows/19.00.24210 /include/system_error(661):注意:请参阅对函数模板实例化的引用`空std::basic_string, std::allocator

/opt/compiler-explorer/windows/19.00.24210/include/stdexcept(21):注意:请参阅类模板实例化“std::basic\u string,std::allocator”

/opt/compiler-explorer/libs/boost_1_67_0\提升/范围/value_type.hpp(26):错误C2146:语法错误:缺失'

/opt/compiler-explorer/libs/boost\u 1\u 67\u 0\boost/iterator/iterator\u traits。hpp(23):错误C2039:“value\u type”:不是“std::iterator\u traits”的成员

    with

    [

        Iterator=int

    ]

/opt/compiler-explorer/libs/boost\u 1\u 67\u 0\boost/iterator/iterator\u traits。hpp(23):注:见“std::iterator\u traits”声明

    with

    [

        Iterator=int

    ]

/opt/compiler-explorer/libs/boost\u 1\u 67\u 0\boost/range/value\u类型。hpp(27):注意:请参阅正在编译的类模板实例化“boost::iterators::iterator\u value”的参考

/opt/compiler-explorer/libs/boost\u 1\u 67\u 0\boost/iterator/iterator\u traits。hpp(23):错误C3646:“类型”:未知重写说明符

/opt/compiler-explorer/libs/boost\u 1\u 67\u 0\boost/iterator/iterator\u traits。hpp(23):错误C4430:缺少类型说明符-假定为int。注意:C不支持默认int

返回的编译器:2

gcc和clang下进行编译。

看https://godbolt.org/g/kccgtb

共有2个答案

时衡虑
2023-03-14

我有一个同事的作品很丑,但看起来很有效

#include "boost/range/value_type.hpp"

namespace foo { 

    template <typename Range>
    typename boost::range_value<Range>::type
    operator|(
       typename std::enable_if<!std::is_fundamental<Range>::value, Range>::type 
          const& r
      , int holder)
    { 
    }
}

using namespace foo;

int main(){}
敖和韵
2023-03-14

一种方法是在模板参数中使用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论证更简洁,也不那么模糊

 类似资料:
  • 为什么using指令在包含在匿名命名空间中时表现得好像出现在全局范围?

  • 在这一节中,我们将探索JavaScript中关于命名空间的模式。命名空间可被看作位于一个唯一标识符下的代码单元的逻辑组合。标识符可以被很多命名空间引用,每一个命名空间本身可以包含一个分支的嵌套命名空间(或子命名空间)。 在应用开发过程中,出于很多原因,我们都要使用命名空间。在JavaScript中,它们帮助我们避免在全局空间中于其他对象或者变量出现冲突。它们对于在代码库中组织功能块也非常有用,这样

  • 关于术语的一点说明: 请务必注意一点,TypeScript 1.5里术语名已经发生了变化。 “内部模块”现在称做“命名空间”。 “外部模块”现在则简称为“模块”,这是为了与ECMAScript 2015里的术语保持一致,(也就是说 module X { 相当于现在推荐的写法 namespace X {)。 这篇文章描述了如何在TypeScript里使用命名空间(之前叫做“内部模块”)来组织你的代码

  • Let the word of Christ dwell in you richly in all wisdom; teaching and admonishing one another in psalms and hymns and spiritual songs, singing with grrace in your hearts tto the Lord. And whatsoever

  • 客户端有许多“命名空间”,通常是一些公开的可管理功能。命名空间对应 Elasticsearch 中各种可管理的 endpoint。下面是全部的命名空间: **命名空间** **功能** `indices()` 索引数据统计和显示索引信息 `nodes()` 节点数据统计和显示节点信息 `cluster()` 集群数据统计和显示集群信息 `snapshot()` 对集群和索引进行拍摄快照或恢复数据

  • 命名空间 由于 js 环境极少命名空间管理模块, namespace 相对陌生, 比如有这样的文件结构, src/ demo/ core.cljs 可以看到 core.cljs 的路径就是: src/demo/core.cljs 注意 JVM 环境有个 classpath 的环境变量, 用于判断怎样查找源码, classpath 对应多个路径, 也可能是 jar 包, 而 jar 包中