未定义的外部变量引用

时间:2010-07-06 07:10:50

标签: c++ static class operator-overloading

我遇到了自定义日志记录系统的问题。我在我的主文件中声明了一个ofstream,以便我的类中的静态函数可以访问它。这适用于我的静态函数(ilra_log_enabled)。但是,这对我的类的重载函数不起作用。我收到一个未定义的“logfile”错误引用。

有什么想法吗?

#ifndef ILRA_H_
#define ILRA_H_

// System libraries
#include <iostream>
#include <ostream>
#include <sstream>
#include <iomanip>
#include <fstream>

// Namespace
using namespace std;

// Classes
class ilra
{
    static int ilralevel_set;
    static int ilralevel_passed;
    static bool relay_enabled;
    static bool log_enabled;
    static ofstream logfile;
public:
    // constructor / destructor
    ilra(const std::string &funcName, int toset)
    {
        // we got passed a loglevel!
        ilralevel_passed = toset;
    }
    ~ilra(){};

    static void ilra_log_enabled(bool toset){
        log_enabled = toset;

        if (log_enabled == true){
            // get current time
            time_t rawtime;
            time ( &rawtime );

            // name of log file
            string logname = "rclient-";
            logname.append(rawtime + ".txt");

            // open a log file
            logfile.open(logname.c_str());
        }
    }

    // output
    template <class T>
    ilra &operator<<(const T &v)
    {
        if(ilralevel_passed <= ilralevel_set)
            std::cout << v;
        if(log_enabled == true)
            logfile << "Test"; // undefined reference to ilra::logfile
        return *this;
    }

};  // end of the class

#endif /* ILRA_H_ */

3 个答案:

答案 0 :(得分:0)

我认为问题是您在重载方法中声明了logfile。它已经在全局声明,并通过在隐藏全局实例的方法中声明它。

由于您对logfile的其他用法有效,我认为您在某个cpp文件中有ofstream logfile;声明。

答案 1 :(得分:0)

extern关键字用于通知编译器在当前范围之外声明的变量。使用extern的声明不会定义变量。外部变量具有静态持续时间(在程序开始时分配,在程序结束时分配)并具有全局可见性。所以你需要定义一个extern变量,就像你做一个静态变量一样,在一个编译单元的范围内(一个cpp文件,最理想的是你定义了main()函数的文件)。做这样的事情可以解决你的问题:

#include "ilra.h"

ofstream logfile("test.log"); // declare and define the global variable.

int main ()
{
  ilra i("hello", 1);  
  i.operator<< <int> (10);
  return 0;
}

答案 2 :(得分:0)

我将变量移到了类中并解决了问题。仍然不确定以前的方法有什么问题。