将程序的失败与模板化的主要链接起来

时间:2017-09-24 01:37:42

标签: c++ linker linker-errors lnk2019

  

LNK2019未解析的外部符号_main在函数&#34中引用; int __cdecl invoke_main(void)" (?invoke_main @@ YAHXZ)

我可以编译我的程序,但无法运行它。它是一个Windows控制台应用程序,它在Linker -> System -> SubSystem中设置为。

#include "stdafx.h"
#include <iostream>
#include <queue>
#include "puzzle.h"
#include "state.h"
#include <vector>

using namespace std;

template <typename Puzzle, typename State>
int main()
{
    Puzzle puzzle8;
    State goalState = new State();
    State currentState = new State();

    //goal state
    goalState.board = { { 1, 2, 3 },
                        { 4, 5, 6 },
                        { 7, 8, 0 } };
    //start state
    currentState.board = { { 8, 2, 1 },
                            { 5, 6, 0 },
                            { 3, 7, 4 } };

    puzzle8.visited.push_back(currentState); //add to visited

    while (!isGoalState(currentState, goalState))
    {           
        int f, best;
        int board1Cost, board2Cost, board3Cost, board4Cost;
        vector<State> newStates = expand(currentState);
        int bestState = getLowestCost(newStates);

        currentState = newStates.at(bestState).board;
        cout << "New State found:" << endl;
        printState(currentState);
        puzzle8.visited.push_back(currentState);

    }
    return 0;
}

1 个答案:

答案 0 :(得分:1)

您无法模板main。它需要是一个非常无聊,非常普通的功能。

目前还不清楚为什么模板部分就在那里。我认为错误就是要删除该行,因为StatePuzzle应该在您正确包含的各自的头文件中定义。

记住template函数实际上不会生成任何已编译的代码,除非它们被使用,然后编译器将生成与所涉及的类型相关的代码。由于此模板已声明且从未使用过,因此它基本上被忽略了。