草庐IT

forward-declaration

全部标签

c++ - 在不使用未命名命名空间的情况下在 header 中隐藏 C++ 类

我正在编写一个C++头文件,我在其中定义了一个classA{//...};我想对外界隐藏(因为它可能会改变,甚至会在这个标题的future版本中被删除)。在同一个标​​头中还有一个类B,它有一个类A的对象作为成员:classB{public://...private:Aa_;};什么是对外界隐藏A类的正确方法?如果我将A的定义放在未命名的命名空间中,编译器会发出警告,因此我认为,由于内部链接的问题,我应该做其他事情。 最佳答案 在C++中正确的做法是PIMPL成语。替代解决方案是将要隐藏的类放入嵌套命名空间,通常称为detail。但

c++ - 如何解决 "class must be used when declaring a friend"错误?

classtwo;classone{inta;public:one(){a=8;}friendtwo;};classtwo{public:two(){}two(onei){cout我从Dev-C++收到此错误:aclass-keymustbeusedwhendeclaringafriend但是用MicrosoftVisualC++编译器编译时它运行良好。 最佳答案 你需要friendclasstwo;代替friendtwo;此外,您不需要单独转发声明您的类,因为友元声明本身就是一个声明。你甚至可以这样做://noforward-de

c++ - 如何理解这个声明中的typedef

最近看了EffectiveC++这本书,第35条里面有一个关于typedef的声明让我很困惑。classGameCharacter;//Question1:Whyuseforwarddeclaration?intdefaultHealthCalc(constGameCharacter&gc);classGameCharacter{public:typedefint(*HealthCalcFunc)(constGameCharacter&);//Question2:Whatdoesthismean?explicitGameCharacter(HealthCalcFunchcf=defau

c++ - 前向声明、unique_ptr 和类内初始化器

我已阅读Isstd::unique_ptrrequiredtoknowthefulldefinitionofT?和Forwarddeclarationwithunique_ptr?,但我的问题更具体。以下编译://Compilewith$g++-std=c++11-c#includeclassA;//fwddeclarationclassAUser{AUser();//definedelsewhere~AUser();//definedelsewherestd::unique_ptrm_a;};以下不是://Compilewith$g++-std=c++11-c#includeclas

c++ - 嵌套命名空间 : where should default template arguments go? 中模板类的前向声明

我在嵌套命名空间中有一个模板类的前向声明namespacen1{namespacen2{templatestructA;}usingn2::A;}接着是一个定义,实际上它在不同的文件中,中间有一些东西:structX{};namespacen1{namespacen2{templatestructA{};}usingn2::A;}那么以下总是可以的:n1::n2::Aa;但是这个捷径n1::Aa;在clang中给出编译错误error:toofewtemplateargumentsforclasstemplate'A'除非我删除前向声明;g++两者都接受。clang似乎保留在第一个不包含

c++ - 错误 : C2988: unrecognizable template declaration/definition

我的两个模板的标题中出现错误。两者都有类似的声明和定义如下:templatevoidsetVideoCodecOption(T1AVCodecContext::*option,T2(CR2CVideoCodecSettings::*f)()const);templatevoidEncoderPrivate::setVideoCodecOption(T1AVCodecContext::*option,(CR2CVideoCodecSettings::*f)()const){T2value=(m_videoSettings.*f)();if(value!=-1){m_videoCodecC

c++ - C++11 的标准库会有前向声明头吗?

在C++03中没有-like文件,同时有header。这在未来会改变吗?减少依赖性和更好的模块化可能很有值(value)。更新:我收到了语言创建者的答复:“实际上不可能要求所有STL供应商都这样做”。 最佳答案 不,没有新的转发文件,只有旧的.与vector相比,完整的I/O系统很大,因此优势可能不那么显着。 关于c++-C++11的标准库会有前向声明头吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.c

c++ - 命名空间 'forward' 中没有名为 'std' 的成员

最近在XCode中制作并测试了一个使用boost的处理库。我刚刚在IDE中设置了一个基本项目,进行了编码,并且构建良好。我现在想在另一个应用程序中使用该库。另一个应用程序的xcode项目是使用第3方工具自动创建的。当我尝试将我的基于boost的库包含在这个其他应用程序中时,我收到错误提示...命名空间“std”中没有名为“forward”的成员还有,线。.#include给出预处理器错误未找到“元组”文件看到原始库在我的机器上构建得很好,错误一定是build设置的差异,但我看不到差异,也不知道比较2个不同的build设置的好方法项目。任何人都可以建议可能导致我出现问题的build设置吗

c++ - 错误 : expected a declaration

到目前为止,我的DecisionTree.h文件中只有namespaceDecisionTree{publicstaticdoubleEntropy(intpos,intneg);}并且VisualStudio已经突出显示了public并说Error:expectedadeclaration.我错过了什么? 最佳答案 public是一个访问说明符。访问说明符仅适用于class/struct主体,不适用于namespace。在C++中(与Java不同)它必须在class主体内跟一个冒号:。例如,classDecisionTree{//

C++ - 前向声明和别名(使用 using 或 typedef)

我需要实现如下接口(interface)structmutex;structinterface{//...mutex&getMutex();};直觉我可以使用usingmutex=ParticularMutex在我的实现中,但gcc告诉我的不是这样:error:conflictingdeclaration‘usingmutex=’error:‘classmutex’hasapreviousdeclarationas‘classmutex’我没有定义任何东西两次,只是声明两次,就像前向声明时一样,所以为什么这行不通?有没有不修改interface的解决方法??应该如何interface被