草庐IT

inline-namespaces

全部标签

c++ - 为什么类型特征不适用于 namespace 范围内的类型?

我正在为我的C++序列化库设计类型注册功能。但是我遇到了一个关于类型特征的奇怪问题。我正在使用VisualStudio2017和/std:c++latest。#includeintreg(...);templateconstexprboolis_known=!std::is_same_v;//-----fortype1inglobalscope------structtype1{};voidreg(type1*);static_assert(is_known);//success//-----fortype2innamespacescope----namespacens{structt

c++ - namespace 的前向声明

namespaceCounterNameSpace{intupperbound;intlowerbound;usingnamespaceNS;//Error}namespaceNS{inti;}//...namespaceNS{intj;}在上面的例子中,它显示了一个错误。错误C2871:“NS”:具有此名称的命名空间不存在我知道如果我在反命名空间问题得到解决之前定义NS。但是只想知道c++中是否存在命名空间的前向声明之类的东西。这样就可以在不定义NS之前解决上述问题counternamespace。请帮忙。 最佳答案 没有人说命名

c++ - namespace 、类和自由函数——什么时候需要完全限定的名称

在我下面的示例中,为什么我必须完全限定cpp中的自由函数的名称以避免链接器错误,为什么它适用于没有的类函数?你能解释一下区别吗?ctest.h:namespaceTest{intFreeFunction();classCTest{public:CTest();~CTest();};}ctest.cpp:#include"ctest.h"usingnamespaceTest;//intFreeFunction()->undefinedreferenceerrorintTest::FreeFunction()->worksjustfine{return0;}CTest::CTest()->

c++ - 为什么我不能从不同 namespace 中的友元类更改类的私有(private)成员?

我发现从好友类访问类的私有(private)成员时遇到问题。持有我要更改的私有(private)成员的类和进行更改的类在不同的命名空间中。friend类是在保存数据的类之后定义的,所以我尝试在命名空间外转发声明friend类。g++说我不能修改成员,因为它是私有(private)的,visualstudio好像觉得没问题。我是不是在做一些奇怪的非标准事情?为什么我不能更改成员?这是一个代表我的问题的简化片段:structS;namespaceN{classA{intm;public:A():m(5){};friendstructS;};}usingnamespaceN;structS{

c++ - 如何修复错误 : unknown type name ‘namespace’

#ifndefUNO_ACTION_#defineUNO_ACTION_namespaceUno{namespaceGame{classGame;}}//namespacenamespaceUno{namespaceAction{using::Uno::Game::Game;classAction{public:virtualboolisDisposeable()=0;virtualvoidtakeAction(Game*game)=0;virtual~Action(){}};}}#endif我在ubuntu12.04上编译这些代码,它返回错误集:action.h:4:1:error:

c++ - 如何在 C 代码中模拟 C++ namespace 功能?

我正在开发一个C++软件,但它通过包含通信协议(protocol)的共享头文件与C应用程序通信。由于C比C++“更基础”,所以我总是需要用C代码编写头文件(所以C++也行);否则它不适用于第二个应用程序。问题是我需要使用一个作用域修饰符,例如C++namespace——它在C中不存在。在C中模拟namespace功能的所有选项是什么?到目前为止我看到的唯一可能性是thisSOquestion中显示的那种,但不幸的是答案不够明确,我当然想知道是否还有其他选择。我还尝试使用struct来完成这项工作,但没有成功(至少考虑使用enumerator的struct)。

c++ - C4711 "function selected for inline expansion"Visual C++ 警告有什么用?

AccordingtoMSDNVisualC++可以发出C4711警告:如果编译器决定内联未标记为内联的函数,则选择函数X进行内联扩展。我不明白这个警告有什么用。假设我编译我的代码并看到这个警告。怎么办?我为什么要关心? 最佳答案 默认情况下未启用。如果出于某种原因你想知道什么时候内联函数,你可以打开它。这可能是相关的,例如,代码大小非常重要,或者您希望从模块外部跳入函数,或者您需要程序集以某种方式显示。它还可以帮助追踪代码生成错误。这纯粹是信息性的。 关于c++-C4711"funct

c++ - 我可以完全停止使用 "inline"吗?

这个问题在这里已经有了答案:whatis/arethepurpose(s)ofinline?(9个回答)关闭9年前。因为它是否内联我的函数完全取决于编译器,我是否可以完全停止使用此关键字(假设它无论如何都会内联所有内容)?

c++ - 如何处理不断发展的 C++ std::namespace?例如:std::tr1::shared_ptr 对比 std::shared_ptr 对比 boost::shared_ptr 对比 boost::tr1::shared_ptr

对于我目前正在处理的代码,我们有时需要使用较旧的编译器在一些较旧的系统上进行编译(例如,我们在较旧的IBMBlueGene/L上运行sims,其支持契约(Contract)规定了一些非常旧的C++编译器)。代码本身使用了shared_ptr,最初是为使用std::tr1::shared_ptr而编写的。在旧的BlueGene机器上编译时,我很快意识到它没有tr1::实现,所以我切换到boost::shared_ptr。原来还有一个boost::tr1::shared_ptr。现在代码在我们的研究小组之外得到了更广泛的使用,可移植性变得更加重要。在大型代码库中处理这些不断演变的标准库问题

c++ - 跨文件共享静态变量 : namespace vs class

这里有很多关于静态与全局的问题,但我认为我的问题有点不同。我想知道是否有一种方法可以像类中的静态变量那样跨文件共享放置在命名空间中的变量。例如,我这样编码://Foo.hclassFoo{public:staticintcode;staticinttimes_two(intin_);};namespacebar{staticintkode;}-//Foo.cppintFoo::code=0;intFoo::times_two(intin_){bar::kode++;code++;return2*in_;}-//main.cppintmain(){cout代码和kode的所有结果:Foo