链接器错误LNK2019

时间:2010-09-09 20:28:11

标签: c++

我一直在玩模板功能,并制作了一个小的记录器程序。我一直在尝试将其拆分为头文件/源文件,但我不断收到链接器错误。我知道这很简单,但我无法弄明白。

此外,我在记录器标题中有一些说服变量,那些将是“适当”的地方? (logStart,logEnd等)

以下所有代码。

标题

#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

来源

#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;
}
*/

主要

#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;
};

2 个答案:

答案 0 :(得分:4)

您需要阅读C ++ FAQ Lite问题"Why can't I separate the definition of my templates class from its declaration and put it inside a .cpp file?"

实际上,您需要在头文件中定义函数和类模板,而不是在.cpp文件中。

答案 1 :(得分:0)

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