为什么我的代码出现LNK2019未解决的外部错误?
Why did the the LNK2019 unresolved external error appear for my code?
我需要一些帮助来解决我解决的链接器错误,但我无法解释原因
这是我的代码,以我的 program.h 文件开头:
#pragma once
#include <vector>
#include <string>
#include <fstream>
template<class T> class InputData
{
public:
InputData(std::string);
void storeDataFromSourceFile();
void putDataFromSourceFileIntoVector(std::vector<T>);
private:
void inputLocationOfSourceFile();
void setSourceFileToLocation();
std::vector<T> inputVector;
std::string locationOfInputFile;
std::fstream sourceFile;
};
这是对应的 program.cpp 代码:
#include <vector>
#include <string>
#include <fstream>
#include "InputData.h"
template<class T> InputData<T>::InputData(std::string source = "")
{
this->locationOfInputFile = source;
if (locationOfInputFile != "")
this->sourceFile.open(locationOfInputFile);
}
template<class T> void InputData<T>::inputLocationOfSourceFile()
{
std::cout << "Please enter location of source file";
std::cin >> this->locationOfInputFile;
}
template<class T> void InputData<T>::setSourceFileToLocation()
{
if (this->locationOfInputFile == "")
this->inputLocationOfSourceFile();
this->sourceFile.open(this->locationOfInputFile);
}
template<class T> void InputData<T>::storeDataFromSourceFile()
{
T inputElement;
if (this->locationOfInputFile == "")
this->setSourceFileToLocation();
while (this->sourceFile >> inputElement)
this->inputVector.push_back(inputElement);
}
template<class T> void InputData<T>::putDataFromSourceFileIntoVector(std::vector<T> destinationVector)
{
destinationVector = this->inputVector;
}
这是我在main.cpp
中的主要功能
#include <string>
#include <iostream>
#include <vector>
#include "InputData.h"
void printVector(std::vector<int> vectorToPrint)
{
for (std::vector<int>::const_iterator i = vectorToPrint.begin(); i != vectorToPrint.end(); ++i)
std::cout << *i << ' ';
}
int main()
{
InputData<int> sourceOfIntegers("Input.txt");
std::vector<int> destinationVector;
sourceOfIntegers.storeDataFromSourceFile();
sourceOfIntegers.putDataFromSourceFileIntoVector(destinationVector);
printVector(destinationVector);
}
当我使用 visual c++ 2013 构建程序时出现以下错误:
error LNK2019: unresolved external symbol "public: __thiscall InputData<int>::InputData<int>(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (??0?$InputData@H@@QAE@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) referenced in function _main
error LNK2019: unresolved external symbol "public: void __thiscall InputData<int>::storeDataFromSourceFile(void)" (?storeDataFromSourceFile@?$InputData@H@@QAEXXZ) referenced in function _main
error LNK2019: unresolved external symbol "public: void __thiscall InputData<int>::putDataFromSourceFileIntoVector(class std::vector<int,class std::allocator<int> >)" (?putDataFromSourceFileIntoVector@?$InputData@H@@QAEXV?$vector@HV?$allocator@H@std@@@std@@@Z) referenced in function _main
通过将函数定义从 program.cpp 移动到 program.h 解决了这个问题,一切正常。
我已经在线检查了此错误的原因,但由于某些原因,我仍然无法解释我的特定代码。
你能具体解释一下为什么会这样吗?
PS: 也检查了 What is an undefined reference/unresolved external symbol error and how do I fix it? 但仍然找不到真正合乎逻辑的解释。
当您声明 class 时,您并未将方法原型化为 return 模板化变体。因此,当它读取您的 class 声明并试图找到预期的函数时,它失败了。
原因是模板对于标准编译和 linking 工具来说过于高级。
C++ 的设计目标之一是向后兼容。 link.exe
只能link"machine code",但模板是"half-generated code"。所以你需要在头文件中实现所有的模板方法。编译器会找到它们并编译。
我需要一些帮助来解决我解决的链接器错误,但我无法解释原因
这是我的代码,以我的 program.h 文件开头:
#pragma once
#include <vector>
#include <string>
#include <fstream>
template<class T> class InputData
{
public:
InputData(std::string);
void storeDataFromSourceFile();
void putDataFromSourceFileIntoVector(std::vector<T>);
private:
void inputLocationOfSourceFile();
void setSourceFileToLocation();
std::vector<T> inputVector;
std::string locationOfInputFile;
std::fstream sourceFile;
};
这是对应的 program.cpp 代码:
#include <vector>
#include <string>
#include <fstream>
#include "InputData.h"
template<class T> InputData<T>::InputData(std::string source = "")
{
this->locationOfInputFile = source;
if (locationOfInputFile != "")
this->sourceFile.open(locationOfInputFile);
}
template<class T> void InputData<T>::inputLocationOfSourceFile()
{
std::cout << "Please enter location of source file";
std::cin >> this->locationOfInputFile;
}
template<class T> void InputData<T>::setSourceFileToLocation()
{
if (this->locationOfInputFile == "")
this->inputLocationOfSourceFile();
this->sourceFile.open(this->locationOfInputFile);
}
template<class T> void InputData<T>::storeDataFromSourceFile()
{
T inputElement;
if (this->locationOfInputFile == "")
this->setSourceFileToLocation();
while (this->sourceFile >> inputElement)
this->inputVector.push_back(inputElement);
}
template<class T> void InputData<T>::putDataFromSourceFileIntoVector(std::vector<T> destinationVector)
{
destinationVector = this->inputVector;
}
这是我在main.cpp
中的主要功能#include <string>
#include <iostream>
#include <vector>
#include "InputData.h"
void printVector(std::vector<int> vectorToPrint)
{
for (std::vector<int>::const_iterator i = vectorToPrint.begin(); i != vectorToPrint.end(); ++i)
std::cout << *i << ' ';
}
int main()
{
InputData<int> sourceOfIntegers("Input.txt");
std::vector<int> destinationVector;
sourceOfIntegers.storeDataFromSourceFile();
sourceOfIntegers.putDataFromSourceFileIntoVector(destinationVector);
printVector(destinationVector);
}
当我使用 visual c++ 2013 构建程序时出现以下错误:
error LNK2019: unresolved external symbol "public: __thiscall InputData<int>::InputData<int>(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (??0?$InputData@H@@QAE@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) referenced in function _main
error LNK2019: unresolved external symbol "public: void __thiscall InputData<int>::storeDataFromSourceFile(void)" (?storeDataFromSourceFile@?$InputData@H@@QAEXXZ) referenced in function _main
error LNK2019: unresolved external symbol "public: void __thiscall InputData<int>::putDataFromSourceFileIntoVector(class std::vector<int,class std::allocator<int> >)" (?putDataFromSourceFileIntoVector@?$InputData@H@@QAEXV?$vector@HV?$allocator@H@std@@@std@@@Z) referenced in function _main
通过将函数定义从 program.cpp 移动到 program.h 解决了这个问题,一切正常。
我已经在线检查了此错误的原因,但由于某些原因,我仍然无法解释我的特定代码。
你能具体解释一下为什么会这样吗?
PS: 也检查了 What is an undefined reference/unresolved external symbol error and how do I fix it? 但仍然找不到真正合乎逻辑的解释。
当您声明 class 时,您并未将方法原型化为 return 模板化变体。因此,当它读取您的 class 声明并试图找到预期的函数时,它失败了。
原因是模板对于标准编译和 linking 工具来说过于高级。
C++ 的设计目标之一是向后兼容。 link.exe
只能link"machine code",但模板是"half-generated code"。所以你需要在头文件中实现所有的模板方法。编译器会找到它们并编译。