jjzjj

Definition

全部标签

c++ - 在头文件中定义非内联函数时出现链接器错误?

在头文件中定义的带有保护的非内联函数#if!defined(HEADER_RANDOM_H)#defineHEADER_RANDOM_Hvoidfoo(){//something}#endif导致链接器错误:已在someother.obj文件中定义使函数内联工作正常,但我无法理解为什么函数在第一种情况下已经出错。 最佳答案 如果头文件包含在多个源文件中并且函数未标记为“内联”,您将有多个定义。包含守卫仅防止同一源文件中的多个包含。 关于c++-在头文件中定义非内联函数时出现链接器错误?,

c++ - 如果我在 header 中声明 namespace ,是否可以避免在 .cpp 文件中使用类名?

这个问题在这里已经有了答案:C++:"Classnamespaces"?[duplicate](4个答案)关闭9年前。在C++中,我只想在.h文件中声明一个DisplayInfo类,然后在.cpp文件中,不必键入第一个DisplayInfo::DisplayInfo()和每个函数定义。遗憾的是,我已经查看了20多个主题和我的C++书籍两个多小时,但仍无法解决这个问题。我认为这是因为我正在尝试在C++中使用我10年的Java培训。第一次试验://DisplayInfo.hnamespaceDisplayInfoNamespace{ClassDisplayInfo{public:Displ

c++ - 命名空间成员定义

namespaceM{voidf();voidM::f(){}}intmain(){}上面的代码报错如下:"ComeauTest.c",line3:error:qualifiednameisnotallowedinnamespacememberdeclarationvoidM::f(){}和G++alsogiveserror.但是VS2010compilesfine.我的问题是:a)预期的行为是什么?b)$7.3.1.2好像没有讲这个限制。标准的哪一部分指导此类代码的行为? 最佳答案 WhichportionoftheStandar

c++ - "potentially-evaluated"是否与 C++03 中的 "odr-used"相同?

举个例子:#includeclassA{public:staticconstintnumberOfWheels=4;};//constintA::numberOfWheels;intmain(){std::cout自A::numberOfWheels以来,它是否正式未定义的行为(UB)在没有定义的情况下被使用?(另请参见here)。正如C++03所述:Themembershallstillbedefinedinanamespacescopeifitisusedintheprogramandthenamespacescopedefinitionshallnotcontainaniniti

c++ - 为什么内联函数会有多个相同的定义?

我正在学习C++入门(第5版),虽然到目前为止它确实是很棒的Material,但我发现在某些情况下我会遇到令人头疼的解释,这些解释给我的问题多于答案。在当前示例中(用粗体强调我的):Unlikeotherfunctions,inlineandconstexprfunctionsmaybedefinedmultipletimesintheprogram.Afterall,thecompilerneedsthedefinition,notjustthedeclaration,inordertoexpandthecode.However,allofthedefinitionsofagiven

c++ - C++ 中的 const 和静态说明符

#includeusingnamespacestd;classA{private:constinta=9;public:voiddisplay(){cout为什么不允许初始化constinta=9。但是好像我写常量staticinta=9编译器没有显示任何错误。写conststaticinta=9是什么意思?我什么时候应该这样写?~ 最佳答案 使用构造函数初始化列表来初始化非静态常量成员。ISOC++03对静态数据成员的描述如下。[class.static.data]9.4.2静态数据成员1Astaticdatamemberisno

c++ - Pimpl with unique_ptr : Why do I have to move definition of constructor of interface to ".cpp"?

只要我不将构造函数(B)的定义移动到标题B.h中,代码就可以工作。B.hclassImp;//imp;B();//B.cpp#include"B.h"#include"Imp.h"B::B(){}~B::B(){}Imp.hclassImp{};Main.cpp(编译我)#include"B.h"Error:deletionofpointertoincompletetypeError:useofundefinedtype'Imp'C2027我能以某种方式理解必须将析构函数移动到.cpp,因为可能会调用Imp的解构:-deletepointer-of-Imp;//somethinglik

c++ - 如何修复 "invalid operands to binary expression"错误?

我没有使用C++的经验,一直卡在编译器生成二进制表达式的无效操作数classAnimal{public:intweight;};intmain(){Animalx,y;x.weight=33;y.weight=3;if(x!=y){//dosomething}}我想使用x并与y进行比较,而不修改主代码中的代码,即(x.weight!=y.weight)。我应该如何从外部类或定义中解决这个问题? 最佳答案 或者,您可以将运算符重载添加为非成员:#includeusingnamespacestd;classAnimal{public:i

c++ - 重新声明错误

我明白了声明和定义的区别当我遇到疑问时,我正在练习一些问题,下面的代码要求我列出片段中的错误。f(inta,intb){inta;a=20;returna;}为什么这会导致a的重新声明错误?它不应该给出a的多个定义,因为在:f(inta,intb)—这里a定义正确吗?并且在函数体中,又定义了inta?那么为什么不是多重定义错误呢? 最佳答案 定义始终是声明。不同之处在于,定义还会为您声明的任何内容提供一些值。顺便说一下,在您的示例中,它只是一个重新声明错误:f(inta,/*Definesa*/intb){inta;/*Declar

c++ - 这些 g++ "multiple definition"错误是怎么回事?

我正处于一个项目的早期阶段(阅读:昨天才开始),我正在设置我的初始makefile。这非常简单。以下是文件的完整内容:all:main.oresource.og++-ooutput.exemain.oresource.omain.o:main.cppmain.hresource.hg++-mwindows-omain.omain.cppresource.o:resource.rcwindresresource.rcresource.oclean:rm*.o在这一点上,我认为重要的是要提到我正在Windows上工作,所以我在Powershell中使用MinGWg++4.5.2或使用Cyg