LNK2005:已定义错误
LNK2005: already defined error
我正在做一项学校作业,我遇到了这个奇怪的错误(我对C++还很陌生(。
我应该找到1500到1900之间的第一个值。当我第一次构建它时,一切都很好,但当我下一次构建时,我得到了这个错误:
error LNK2005: "bool __cdecl greaterThan1500SmallerThan1900(int)" (?greaterThan1500SmallerThan1900@@YA_NH@Z) already defined in Lab5.obj
如果我稍微更改代码(将谓词函数中的类型更改为double(,它会再次构建一次。
template<typename T>
T MyStlClass<T>::myFindIf(list<T> &theList) {
list<T>::iterator it = find_if(theList.begin(), theList.end(), greaterThan1500SmallerThan1900);
return *it;
}
bool greaterThan1500SmallerThan1900(int value){
return (value >= 1500 && value <= 1900);
}
我在这个网站上读到,这是因为我包括".cpp"文件,但另一方面,我也读到,当我使用模板时,我需要包括".cpp."文件。
我还读到,当我使用模板时,我需要包含".cpp"文件。
扔掉/投反对票/为我们确定告诉你这样做的资源。
它这样做是有充分理由的,但建议是错误的,它直接导致您遇到这个问题。
切勿将#include
作为.cpp
放入模板定义的文件应该称为.ipp
,而不是.cpp
,这样您的IDE就不会将其与"常规"源文件混淆,并将其与项目的其余部分一起构建。这样的文件就像.h
一样,只有#include
d。
您的greaterThan1500SmallerThan1900
不是模板,这就是为什么多次#include
的主体是错误的(这就是为什么它必须链接一次(。
你必须把这个函数从模板化的东西中分离出来。这个函数应该在一个cpp文件中,而不是#include
d,而是添加到您的项目中。(您似乎已经在调用它的地方有了它的声明——它应该保持原样(。
对于模板,您可能会听从另一个答案的建议(重命名为*.ipp
,将其#include
从项目中删除(,但错误会在您这样做之前消失(将额外的仅模板源文件编译为空对象是无用的,但这不会造成伤害(。
如果您正在编写仅头库/模块,则使用#pragma once
以避免多个包含,并标记greaterThan1500SmallerThan1900
函数inline
:
// MyStlClass.hpp
#prgma once
....
template<typename T>
T MyStlClass<T>::myFindIf(list<T> &theList) {
list<T>::iterator it = find_if(theList.begin(), theList.end(), greaterThan1500SmallerThan1900);
return *it;
}
// NOTE inline here:
inline bool greaterThan1500SmallerThan1900(int value){
return (value >= 1500 && value <= 1900);
}
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 使用命名空间时出现多个定义错误
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 编写代码时C++出现错误:错误 1 错误 C2601:'circle':本地函数定义是非法的
- 在运算符重载定义中使用成员函数(const错误)
- 尝试调用 .h 文件中定义的变量时出现变量未定义错误
- 在C++中使用内联方法时出现未定义的符号错误
- 已定义函数时出现 G++ "未定义的引用"错误
- C++ G++ 编译器 - 错误:隐式声明的定义
- 链接 cmake 时出现未定义的引用错误
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 错误:未定义对'oboe::AudioStreamBuilder::openStream(oboe::AudioStream**)'的引用
- 链接阶段出现多重定义错误
- 已经以性格错误定义了
- vim ctag导致了对乐趣的错误定义
- C++ 隐式声明的编译器错误定义
- 编译器错误-定义问题.C++