1
63
问题是以下代码是一个定义,而不是一个声明:
您可以将上面的函数标记为“inline”,以便多个翻译单元可以定义它:
或者您可以简单地将函数的原始定义移动到“complex.cpp”源文件中。 编译器不会抱怨“real()”,因为它是隐式内联的(在类声明中给出其主体的任何成员函数都会被解释为已声明为“inline”)。预处理器保护防止头从单个翻译单元(“*.cpp”源文件)包含多次。但是,两个翻译单元看到相同的头文件。基本上,编译器将“main.cpp”编译为“main.o”(包括“main.cpp”包含的头中给出的任何定义),编译器将“complex.cpp”单独编译为“complex.o”(包括“complex.cpp”包含的头中给出的任何定义)。然后链接器将“main.o”和“complex.o”合并到一个二进制文件中;在这一点上,链接器为一个同名函数找到了两个定义。也正是在这一点上,链接器试图解析外部引用(例如,“main.o”指的是“Complex::Complex”,但没有该函数的定义。。。链接器从“complex.o”中定位定义,并解析该引用)。 |
2
5
将实现移到complex.cpp 现在,在包含此文件之后,正在将实现编译到每个文件。 稍后在链接过程中,由于重复的实现,会出现明显的冲突。 ::real()未报告,因为它是隐式内联的(类定义内的实现) |
3
1
我有这个问题,即使在我的源和头文件是正确的。
要修复,请使用
|
4
0
定义
|
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
rainer · 后台插入程序的初始化 1 年前 |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |