未解析的外部符号错误,仅在标头中定义函数时有效

unresolved extern symbol error, only works when define function in the header

本文关键字:定义 函数 有效 外部 符号 错误      更新时间:2023-10-16

大家好,我在这里的第一篇帖子,如果我的风格让你感到恼火,请告诉我我想学习如何在这里发帖。我希望有人能帮我处理这个LNK2019错误

我得到了两个源文件,战列舰.cpptester.cppmain()函数位于Leetcode.cpp程序将不会编译并给出错误LNK1120LNK2019虽然如果我把Solution类函数定义放在头文件battleship.h中,程序实际上是编译的(到目前为止对原型运行良好),但我不确定这是否是一个好的做法,因为这些函数不是模板函数,我无法证明把它们放在.h文件中是合理的

错误消息:

Severity    Code    Description Project File    Line    Suppression State
Error   LNK2019 unresolved external symbol "public: int __thiscall tom::Solution::boardPrinter(class std::vector<class std::vector<char,class std::allocator<char> >,class std::allocator<class std::vector<char,class std::allocator<char> > > > &)" (?boardPrinter@Solution@tom@@QAEHAAV?$vector@V?$vector@DV?$allocator@D@std@@@std@@V?$allocator@V?$vector@DV?$allocator@D@std@@@std@@@2@@std@@@Z) referenced in function "int __cdecl tom::battleshipTester(void)" (?battleshipTester@tom@@YAHXZ)  Leetcode    C:UsersShindocumentsvisual studio 2015ProjectsLeetcodeLeetcodetester.obj    1   

战列舰.cpp的代码

#include "stdafx.h"

namespace tom{
class Solution{
public:
int countBattleships(std::vector<std::vector<char>>& board) {
return 0;
}
int boardPrinter(std::vector<std::vector<char>>& board)
{   
return 0;
}
int Solution::simpleBoardBuilder(std::vector<std::vector<char>>& board)
{
return 0;
}
};
}

战列舰的代码。h

#pragma once
#include "stdafx.h"

namespace tom {
class Solution {
public:
int countBattleships(std::vector<std::vector<char>>& board);
int boardPrinter(std::vector<std::vector<char>>& board);
int simpleBoardBuilder(std::vector<std::vector<char>>& board);
};
}

tester.cpp的代码

#include "stdafx.h"
#include "battleship.h"
namespace tom {
int battleshipTester(void)
{
//called in main function
//call countBattleships
std::vector<std::vector<char>> board;
Solution baseline;
baseline.countBattleships(board);
baseline.boardPrinter(board);
baseline.simpleBoardBuilder(board);
return 0;
}
}

tester.h的代码

#pragma once
#include "stdafx.h"
namespace tom {
int battleshipTester(void);
//int simple

}

Leetcode.cpp的代码,其中主函数也是

// Leetcode.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "tester.h"
int main()
{   
tom::battleshipTester();
return 0;
}

您的代码中存在多个问题:

  1. Battleship.h不包含在Battleship.cpp
  2. 您已定义class Solution两次
  3. 您已经在实现(.cpp)文件中定义了class Solution
  4. 您尚未将tester.h包含在tester.cpp

错误消息的字面意思是编译器找不到您声明的函数的定义。这是真的;Battleship.cpp不包括在内,因此编译器看不到定义。然而,即使它已经包含在内,您仍然会收到错误(请参阅上面的编号项目)。

除了nikaza已经回答了什么,请参阅以下评论。

countBattleships(std::vector<std::vector<char>>& board)

是错误的。你应该在<char>之后有一个额外的空间,就像下面这样

countBattleships(std::vector<std::vector<char> >& board)

只有这样,您的代码才能编译。

虽然您在任何地方都使用了vector,但我在任何文件中都看不到任何#include <vector>。您可能希望在.h文件中#include <vector>

战列舰.cpp应该是这样的:

#include "battleship.h"
namespace tom{
int Solution::countBattleships(std::vector<std::vector<char> >& board) {
return 0;
}
int Solution::boardPrinter(std::vector<std::vector<char> >& board)
{
return 0;
}
int Solution::simpleBoardBuilder(std::vector<std::vector<char> >& board)
{
return 0;
}
}

tester.cpp应该是这样的:

#include "tester.h"
#include "battleship.h"
namespace tom {
int battleshipTester(void)
{
//called in main function
//call countBattleships
std::vector<std::vector<char> > board;
Solution baseline;
baseline.countBattleships(board);
baseline.boardPrinter(board);
baseline.simpleBoardBuilder(board);
return 0;
}
}

战列舰.h应该是这样的:

#pragma once
#include <vector>
namespace tom {
class Solution {
public:
int countBattleships(std::vector<std::vector<char> >& board);
int boardPrinter(std::vector<std::vector<char> >& board);
int simpleBoardBuilder(std::vector<std::vector<char> >& board);
};
}

tester.h应该是这样的:

#pragma once
namespace tom {
int battleshipTester(void);
//int simple
}

最后leetcode.cpp应该是这样的:

#include "tester.h"
int main()
{
tom::battleshipTester();
return 0;
}