Неопределенная ссылка на внешнюю переменную - PullRequest
0 голосов
/ 06 июля 2010

Возникли проблемы с пользовательской системой регистрации, которую я сделал. Я объявляю офстрим в моем основном файле, чтобы он был доступен статическим функциям в моем классе. Это работает для моей статической функции (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 голосов
/ 06 июля 2010

Ключевое слово 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;
}
0 голосов
/ 17 июля 2010

Я переместил переменные в класс и решил проблему.Все еще не уверен, что не так с предыдущим методом.

0 голосов
/ 06 июля 2010

Я думаю, проблема в том, что вы объявляете logfile внутри вашего перегруженного метода. Он уже объявлен глобально, и, объявив его в методе, вы скрываете глобальный экземпляр.

Поскольку ваше другое использование logfile работает, я полагаю, у вас есть объявление ofstream logfile; в каком-то cpp-файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...