未解析的extern符号错误,仅在标题

时间:2017-01-21 00:29:37

标签: c++ templates header lnk2019 unresolved-external

大家,我在这里的第一篇文章,如果我的风格让你烦恼,请让我知道我想学习如何在这里发帖。我希望有人可以帮我解决LNK2019错误

我有两个源文件, battleship.cpp tester.cpp main()函数位于 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:\Users\Shin\documents\visual studio 2015\Projects\Leetcode\Leetcode\tester.obj    1   

battleship.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;
        }
    };
}

battleship.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;
}

2 个答案:

答案 0 :(得分:0)

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

  1. Battleship.h未包含在Battleship.cpp
  2. 您已定义class Solution两次
  3. 您已在实施(class Solution)文件
  4. 中定义了.cpp
  5. 您尚未在tester.h
  6. 中加入tester.cpp

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

答案 1 :(得分:0)

nikaza已回答的内容外,请参阅以下评论。

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

错了。在<char>之后你应该有一个额外的空格

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

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

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

battleship.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;
    }
}

battleship.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;
}