2017-01-21 10 views
0

все, мой первый пост здесь, если мой стиль раздражает ваш, пожалуйста, дайте мне знать. Я ищу, чтобы узнать, как публиковать здесь. Я надеюсь, что кто-то может помочь мне с этим LNK2019 ОшибкаНеразрешенная ошибка символа extern, работает только при определении функции в заголовке

я получил два исходных файлов, battleship.cpp и tester.cpp, функция main() внутри Leetcode.cpp программа не будет компилировать и дают ошибку LNK1120 и LNK2019 время, если я ставлю определение функции Solution класса в файле заголовка battleship.h программа на самом деле компиляции (и до сих пор работает хорошо для прототипа) - до сих пор, я не уверен, если это хороший пр actice, поскольку эти функции не являются шаблонными функциями, и я не могу оправдать положить их в файле .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> > > > &)" ([email protected]@[email protected]@[email protected][email protected][email protected]@[email protected]@@[email protected]@[email protected][email protected][email protected]@[email protected]@@[email protected]@@[email protected]@[email protected]@@Z) referenced in function "int __cdecl tom::battleshipTester(void)" ([email protected]@@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; 
} 
+0

Это неопределенное поведение. Файл заголовка определяет класс данного имени. Файл cpp определяет другой класс с тем же именем. –

+0

Мне немного странно, что ваш 'battleship.cpp' не включает' battleship.h'. Не так ли? – WhozCraig

+0

Проблемы с библиотечной библиотекой связаны с библиотеками, не связанными с проектом, связаны ли вы с библиотекой с проектом Leetcode.cpp? – Abhinav

ответ

0

У вас есть несколько проблем в коде:

  1. Battleship.h не входит в Battleship.cpp
  2. Вы определили class Solution дважды
  3. Вы определили class Solution в реализации (.cpp файл)
  4. Вы не включили tester.h в tester.cpp

Сообщение об ошибке буквально означает, что компилятор не может найти определение объявленной функции. Это правда; Battleship.cpp не включен, поэтому для компилятора не существует определения. Однако, даже если он был включен, вы все равно получите ошибки (см. Пронумерованные пункты выше).

+0

Кажется, я ужасно ошибаюсь, давайте изменим его и вернемся – petergx

+0

происходит с лучшими из нас :) – nikaza

+0

привет, спасибо за помощь! удалите дублирующее определение класса 'Solution' в' battleship.cpp', и в основном я следую кончику 1,2,3 из вашего ответа, а не код компилируется, но я не уверен, почему я должен включать 'тестер .cpp' в 'tester.h', я имею в виду, обычно мы просто включаем' .h' файл правильно? – petergx

0

В дополнение к тому, на что ответил nikaza, ознакомьтесь со следующими комментариями.

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

не соответствует действительности. Вы должны иметь дополнительное пространство после <char>, как это ниже

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

Только после этого ваш код компиляции.

Пока вы использовали vector всюду, я не вижу #include <vector> в любых файлах. Вы можете #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; 
} 
+0

Благодарим вас за ответ, после некоторой модификации мой код выглядит как ваш прямо сейчас. Я включил '' в 'stdafx.h' вместе с другой библиотекой, которую я мог бы использовать, так как это всего лишь небольшой проект, который я не ищу, чтобы ускорить время компиляции, но все еще не уверен, что это хорошая практика (хотя кажется отлично работает) – petergx

+0

Подробнее о stdafx.h здесь: http://stackoverflow.com/questions/2976035/purpose-of-stdafx-h. Хорошо знать, что ваш код компилируется и выполняется сейчас. – Rishi