繁体   English   中英

Visual C ++中的链接器错误LNK2019

[英]Linker Error LNK2019 in Visual C++

尝试从主方法调用类方法时遇到链接器错误。 我已经搜索了答案,但是似乎没有任何问题适用于我的问题,我们将不胜感激。

FileSystem.h

#ifndef FILE_SYSTEM_H
#define FILE_SYSTEM_H

#include <fstream>
#include <string>
#include <random>

#include "SortingAlgorithms.h"
#include "SortingAlgorithms.cpp"

using namespace std;

class FileSystem
{
private:
    ifstream inFile;
    ofstream outFile;

    template <class T>
    void fillArrays( T randomArray[], T sortedArray[], T backwardArray[], int size );

public:
    FileSystem();
    ~FileSystem();

    bool openFile(string fileName);
    void writeToFile(string output);
    void createTestFiles(string testFiles[]);

    template <class T>
    void fillArrayFromFile(T list[], int size);
};

#endif

fillArrayFromFile

template <class T>
void FileSystem::fillArrayFromFile(T list[], int size)
{
    int i;

    for(i = 0; i < size; i ++)
    {
        inFile >> list[i];
    }

    inFile.clear();
    inFile.seekg(inFile.beg);
}

pa2.cpp

#include <iostream>
#include <ctime>
#include <string>
#include <iomanip>

#include "TimerSystem.h"
#include "FileSystem.h"

using namespace std;

int main()
{
    FileSystem file;
    int testArray[10];

    file.openFile("test-10-0.txt");
    file.fillArrayFromFile(testArray, 10);
}

错误:

pa2.obj : error LNK2019: unresolved external symbol "public: void __thiscall FileSystem::fillArrayFromFile<int>(int * const,int)" (??$fillArrayFromFile@H@FileSystem@@QAEXQAHH@Z) referenced in function _main
C:\Users\Matt\Google Drive\Programming\Data Structures & Algorithms\PA2-9-15-2012\Debug\PA2.exe : fatal error LNK1120: 1 unresolved externals

再次感谢。

在编译调用template函数的代码时,编译器必须能够看到该函数的完整实现。 至此,编译器正在构建pa2.cpp ,编译器仅查看FileSystem.h以及头文件(当然也包括pa2.cpp包含的其他头文件)中的定义。 此时,它不会查看FileSystem.cpp的内容。

要解决此问题,请将FileSystem::fillArrayFromFile()的实现移至文件而不是.cpp文件。 您可以通过以下两种方式之一进行操作:

class FileSystem {
public:
    template <class T>
    void fillArrayFromFile(T list[], int size);
};

template <class T>
void FileSystem::fillArrayFromFile(T list[], int size)
{
    // ...
}

要么

class FileSystem {
public:
    template <class T>
    void fillArrayFromFile(T list[], int size)
    {
        // ...
    }
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM