草庐IT

declare_namespace

全部标签

c++ - 在使用 Clang 编译 CRTP Singleton 时,如何解决声称缺少 "explicit instantiation declaration"的问题?

我们正在使用curiouslyrecurringtemplatepattern实现单例。但是,在最近的Clang版本中,我们收到了-Wundefined-var-template警告。建议的修复方法是添加“显式实例化声明”。我试图这样做,但后来在定义单例模板类成员变量的编译单元中出现有关“实例化后的显式特化”的错误。解决此警告突出显示的问题的适当构造是什么?简化详细信息(已删除大部分逻辑,以制作MCVE):单例基础.hh:templateclassSingletonBase{public:staticT*get_instance(){if(!instance_){instance_=T

c++ - 在 header 中使用未命名的 namespace 会如何导致 ODR 违规?

在GoogleC++风格指南中,Namespaces部分指出“在头文件中使用未命名的命名空间很容易导致违反C++统一定义规则(ODR)。”我明白为什么不在实现文件中使用未命名的命名空间会导致ODR违规,但不知道在header中使用如何做到这一点。这怎么会导致违规? 最佳答案 原因是如果你真的在匿名中使用任何东西命名空间,你冒着未定义行为的风险。例如:namespace{doubleconstpi=3.14159;}inlinedoubletwoPiR(doubler){return2.0*pi*r;}内联函数(以及类、模板和任何其他

c++ - 为什么我不能将此运算符重载放在与结构相同的 namespace 中?

我有以下代码:#include#includenamespaceX{std::ostream&operator&v){for(inti=0;ix;};std::ostream&operatorv(10,0);std::cout第一个重载有效,但第二个无效。由于某种原因,它找不到第一个。我收到错误:nomatchfor'operator}'and'conststd::vector')os我不明白为什么会出现此错误。例如,这样的事情似乎是完全有效的:namespaceA{voidfoo(){}namespaceB{voidbar(){foo();}}}但是,解决上述问题的唯一方法是将第二个

c++ - 现代 C 和 C++ : it is possible to use one defined structure for other declared structure?

假设我想制作某种支持加载图形Image的引擎,所以我有structImage;Image*load_image_from_file(...);我不想让外部世界知道Image到底是什么,他们只会处理指向它的指针。但是在engine内部我想使用特定的类型,例如SDL_Surface在SDL中完全定义。我能否以某种方式重新定义此文件的图像,以便编译器在每次看到Image*(宏除外)时都假定为SDL_Surface*?即我想要像typedefstructSDL_SurfaceImage;这样的东西所有的尝试都像usingImage=SDL_Surface;typedefSDL_SurfaceI

c++ - 为什么C++标准中的declaration-seq是这样写的?

declaration-seq:declarationdeclaration-seqdeclaration不是这样的:declaration-seq:declarationdeclarationdeclaration-seq这两个定义可以互换吗?它们有什么区别? 最佳答案 这是C++的C遗产的遗迹。C语法(几乎)是LALR(1),因此使用leftrecursion越多越好。C++语法甚至不再是模糊的LALR,但许多规则仍然以LALR解析器更喜欢的形式编写,因为没有理由改变它们——任何强大到足以处理C++的解析器算法都不关心哪种类型的

c++ - 不合格的名称查找 : Why local declaration hides declaration from using directive

考虑这段代码:namespaceA{inti=24;}namespaceB{usingnamespaceA;inti=11;intk=i;//findsB::i,noambiguity}和basic.lookup.unqual.2:§6.4.1Unqualifiednamelookup[basic.lookup.unqual]Thedeclarationsfromthenamespacenominatedbyausing-directivebecomevisibleinanamespaceenclosingtheusing-directive;see[namespace.udir].F

c++ - 前向声明的类型和 "non-class type as already been declared as a class type"

我对以下代码有疑问:templatevoidfoo(structbar&b);structbar{};intmain(){}它在GCC上编译成功,但在MSVC(2008)上编译失败并出现以下错误:C2990:“bar”:已声明为类类型的非类类型是代码错误还是MSVC中的错误?如果我在模板定义之前添加structbar;就可以了。 最佳答案 我们有我们的赢家:https://connect.microsoft.com/VisualStudio/feedback/details/668430/forward-declared-type-

c++ - Clang VS VC++ :"error: declaration of ' T'阴影模板参数”

我正在尝试为theclassiccopy&swapidiom编译以下代码在我的Mac上使用clang3.3templateclassnode{private:node*left;node*right;Tvalue;public:friendvoidswap(node&,node&);//otherstuff}然而链接器却报错了。我现在明白我应该将函数声明为模板。但是,如果我按照建议的样式进行操作,则会发生错误here来自MSDN:templateclassArray{T*array;intsize;public:template//...templatefriendArray*comb

c++ - 获取错误 : 'mutex' in namespace 'std' does not name a type in MinGW mysys prompt

我已经从官方网站下载了MinGW并将其安装在我的Windows8.1机器上。运行g++--version给我g++.exe(GCC)4.8.1。我正在尝试在MinGW编译器中编译现有的代码库,但它因以下错误而失败:error:'mutex'innamespace'std'doesnotnameatypeprivate:std::mutexm_Mutex;^error:'condition_variable'innamespace's还有更多与锁定和线程相关的错误。!我能够在Cygwin-64中编译相同的代码库,没有任何问题。我需要在MinGW中成功构建和编译,以便创建一些与MSVS兼容

c# - 为什么在任何编程语言中都有声明默认 namespace /库的约定?

为什么没有任何编程语言加载默认库,如stdio.h、iostream.h或usingSystem,以便声明避免了吗?由于这些命名空间/库在任何程序中都是必需的,为什么编译器期望它由用户声明。是否存在不使用namespace/header的程序?即使是,加载无害的默认库有什么问题?我不是那个意思..我懒得写一行代码但是编译器哭着声明所谓的defaultthingummiesending是没有意义的(对我来说)出现编译错误。 最佳答案 这是因为有的程序是在没有标准库的情况下编写的。例如,有许多在不提供stdio.h的嵌入式系统上运行的C