简体   繁体   English

链接器错误LNK2019

[英]Linker Error LNK2019

I have been playing around with Template functions, and made a little logger program. 我一直在玩模板功能,并做了一个小的记录器程序。 I have been trying to split this into header / source file, but I keep getting linker errors. 我一直在尝试将其拆分为头文件/源文件,但我不断收到链接器错误。 I know this is simple, but I cant figure it out. 我知道这很简单,但我无法弄明白。

Also I have some convince vars in the logger header, where would be the "proper" place for those? 此外,我在记录器标题中有一些说服变量,那些将是“适当”的地方? (logStart, logEnd etc.) (logStart,logEnd等)

All code below. 以下所有代码。

Header

#ifndef __moot_logger_hpp__
#define __moot_logger_hpp__


#include <iostream>
#include <fstream>
#include <string>

using std::ios;

namespace Moot
{
    struct Logger
    {
        Logger();
        ~Logger() {}


        template <class T>      
        void saveToFile(T type);

        template <typename T>
        Logger& operator<< (T type);


        /*
        Logger& operator<< (std::wstring wideStr)
        {
            saveToFile(Moot::convertWstringToString(wideStr));
            return *this;
        }
        */
    };


    /*
    namespace {
        Logger logStart;
        Logger& lStart = logStart;

        const char  logEnd = '\n';
        const char& lEnd   = logEnd;

        const char  logSpace = ' ';
        const char& lSpace   = logSpace;
    }
    */

}


#endif

Source 资源

#include <Moot/logger.hpp>

Moot::Logger::Logger()
{
    std::ofstream logfile;
    logfile.open ("logfile.txt", ios::trunc);
    logfile << "LogFile - most recent at the bottom\n";
    logfile << "-----------------------------------\n \n";
    logfile.close();
}


template <typename T>
void Moot::Logger::saveToFile(T type)
{
    std::ofstream logfile;
    logfile.open ("logfile.txt", ios::in | ios::app);
    logfile << type;
    logfile.close();
}


template <typename T>
Moot::Logger& Moot::Logger::operator<< (T type) 
{
    saveToFile(type);
    return *this;
}


/*
Logger::Logger& operator<< (std::wstring wideStr)
{
    saveToFile(Moot::convertWstringToString(wideStr));
    return *this;
}
*/

main 主要

#include <Moot/logger.hpp>
#include <iostream>

int main()
{
    std::cout << "hello" << std::endl;

    Moot::Logger() << 12;
    //Moot::lStart.saveToFile(23);
    //Moot::lStart.operator << 13;

    return 0;
};

You'll want to read the C++ FAQ Lite question, "Why can't I separate the definition of my templates class from its declaration and put it inside a .cpp file?" 您将要阅读C ++ FAQ Lite问题, “为什么我不能将模板类的定义与其声明分开并将其放在.cpp文件中?”

Effectively, you need to define your function and class templates in the header file, not in the .cpp file. 实际上,您需要在头文件中定义函数和类模板,而不是在.cpp文件中。

如果你想要从模板类的声明中划分除定义而不是使用hpp或tpp将文件移动到单独的文件(tpp并不总是由文本编辑器正确处理)扩展并在声明文件的末尾添加定义文件的include指令

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

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