程序继续提供此类LNK错误

时间:2017-03-22 16:01:43

标签: c++ vector struct

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

中引用

如何修复此错误? 对不起我是新手编码器,如果需要更多细节,请告诉我,我会相应编辑。感谢您的帮助。

2 个答案:

答案 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)

  1. 第一个错误的错误消息,可以缩写为:

      

    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> bankAccountsextern,只声明在某个时刻会定义这样的变量,并且由于您将定义一次全局变量,链接器将不会看到所述变量的多个定义。

  2. 第二个错误就像听起来一样:你声明了(并尝试调用带有签名void makeAccount(vector <Account>&);的函数,但是,你定义了一个带有签名void makeAccount();的函数,离开函数{ {1}} undefined。修复函数的定义以包含参数,该参数出现在其声明中:

    void makeAccount(vector <Account>&);
  3. 与您的问题无关,但我觉得我应该提到更多的事情:

    1. 请勿使用void makeAccount(vector <Account>&) { return; } ,尤其是头文件it is considered a bad practice
    2. 您的代码甚至如何到达链接器阶段?它甚至不应该编译,因为using namespace std;是在Account之后声明的,并且在这样的函数声明时 - 编译器不知道void makeAccount(vector <Account>&); struct。 / LI>