header.h
window.location.pathname.match(/\/(\d{2}-\d{3})\//)
CPP
#include <iostream>
#include <vector>
#include <ctime>
#include <string>
using namespace std;
//vector <Account> bankAccounts; this is taken out.
extern vector <Account> bankAccounts; //edited
struct Account {
int accountNumber;
string lastName;
string firstName;
double accountbalance;
};
void menu(int*);
void makeAccount(vector <Account>&);
另一个cpp
#include "Header.h"
void menu(int*);
void makeAccount(vector <Account>&);
vector <Account> bankAccounts; //edited
int main() {
int input = 0;
int *inputPtr = &input;
menu(inputPtr);
switch (input) {
case 1:
makeAccount(bankAccounts);
}
}
}
运行程序时,错误给出:
main_file.obj:错误LNK2005:“class std :: vector&gt; bankAccounts”(?bankAccounts @@ 3V?$ vector @ UAccount @@ V?$ allocator @ UAccount @@@ std @@@ std @@ A )已在function_file.obj中定义 1&gt; main_file.obj:错误LNK2019:未解析的外部符号“void __cdecl makeAccount(class std :: vector&gt;&amp;)”(?makeAccount @@ YAXAAV?$ vector @ UAccount @@ V?$ allocator @ UAccount @@@ std @@@ std @@@ Z)在函数_main
中引用
如何修复此错误? 对不起我是新手编码器,如果需要更多细节,请告诉我,我会相应编辑。感谢您的帮助。
答案 0 :(得分:0)
1。 bankAccounts
已在function_file.obj中定义。
您应该在cpp文件中定义bankAccounts
。因为如果您在头文件中定义它,当您在多个cpp文件中包含标题时,backAccounts
会有多个定义。
如果您需要多个cpp文件,请使用extern
在头文件中声明(不定义)它:
extern vector <Account> bankAccounts;
在您的cpp文件的 之一中,将其定义为:
vector <Account> bankAccounts;
2。未解析的外部符号void makeAccount()
makeAccount()
的定义应该是:
void makeAccount(vector <Account>&)
{
// do something
}
当您将其定义为void makeAccount(vector<Account>)
时。请注意区别。在您的声明中,参数是对向量的引用,而在您的定义中,参数是向量对象。
答案 1 :(得分:0)
第一个错误的错误消息,可以缩写为:
main_file.obj:错误LNK2005:
std::vector<Account> bankAccounts
已在function_file.obj中定义
此错误的原因是所包含的文件被复制粘贴以代替#include
。这样,std::vector<Account> bankAccounts
在两个文件中定义(它们是完全独立的对象!),因此链接器因多重定义而抱怨。
要解决此问题,请在头文件中将声明全局变量extern std::vector<Account> bankAccounts
,然后在一个的.cpp文件中将其定义为std::vector<Account> bankAccounts
。 extern
,只声明在某个时刻会定义这样的变量,并且由于您将定义一次全局变量,链接器将不会看到所述变量的多个定义。
第二个错误就像听起来一样:你声明了(并尝试调用带有签名void makeAccount(vector <Account>&);
的函数,但是,你定义了一个带有签名void makeAccount();
的函数,离开函数{ {1}} undefined。修复函数的定义以包含参数,该参数出现在其声明中:
void makeAccount(vector <Account>&);
与您的问题无关,但我觉得我应该提到更多的事情:
void makeAccount(vector <Account>&) {
return;
}
,尤其是头文件it is considered a bad practice。using namespace std;
是在Account
之后声明的,并且在这样的函数声明时 - 编译器不知道void makeAccount(vector <Account>&);
struct
。 / LI>
醇>