Неопределенная ссылка на статическую функцию-член класса Singleton - PullRequest
0 голосов
/ 25 марта 2012

Я реализую класс Singleton для ведения журнала. Я объявляю static logging_instance_ для создания только одного экземпляра для имени класса support_service::logging_service. Экземпляр вызова Service_logging класса support_service::logging_service, который объявляет статическую переменную ::logging_instance_, но показывает ошибку

undefined reference to `support_service::logging_service<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int>::logging_service()' collect2: ld returned 1 exit status

support_service.hpp

namespace support_service
{                  
template<typename PATH = std::string , typename LEVEL =  int>

  class logging_service
 {

    public:

     static  boost::shared_ptr<logging_service<PATH,LEVEL> > instance();   
     ....
   private:

     logging_service();
     logging_service(const logging_service<PATH,LEVEL>&);                                                                                                                                       
     static boost::shared_ptr<logging_service<PATH,LEVEL> >  logging_instance_;                                                                                                                 
 };     
}   

template<typename PATH, typename LEVEL>                                                                                                                                                        
    boost::shared_ptr<logging_service<PATH,LEVEL> > logging_service<PATH,LEVEL>::instance()                                                                                                     
     {                                                                                                                                                                                          
       if(logging_instance_.get() == NULL)                                                                                                                                                      
           logging_instance_ = boost::shared_ptr<logging_service<PATH,LEVEL> >(new logging_service<PATH,LEVEL>``());                                                                              
       return logging_instance_;                                                                                                                                                                
     }

service_logging.hpp

using     namespace support_service;            

template<typename PATH, typename  LEVEL>                                                                                                                                                       
boost::shared_ptr<logging_service<PATH,LEVEL> >support_service::logging_service<PATH,LEVEL>::logging_instance_;


namespace service_logging
 {

     template<typename PATH = std::string, typename LEVEL = int> 
     class service_logging
     {   
       public:
       service_logging();
       bool set_logging(PATH  file_path);
     }; 
}



template<typename PATH, typename LEVEL>
bool service_logging<PATH,LEVEL>::set_logging(PATH  file_path)                                                                                                                                   
{
 boost::shared_ptr<logging_service<PATH,LEVEL> > logging_ =  logging_service<PATH,LEVEL>::instance();                                                                                      
 ...                                                                                                                                                                                 
}

Ответы [ 2 ]

1 голос
/ 25 марта 2012

Одна вещь, которую я заметил, заключалась в том, что у вас нет тела для вашего logging_service или конструктора service_logging, могло ли это быть исключено из опубликованного кода?

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

0 голосов
/ 27 апреля 2012

вы объявляете ctor support_service::logging_service<PATH,LEVEL>::logging_service в заголовочном файле support_service.hpp (строка 14) и даже вызываете его для неопределенных PATH и LEVEL в том же заголовочном файле (строка 24).Однако вы не можете дать определение, поэтому конечно вы получите ошибку неопределенной ссылки, что еще вы ожидаете?

Решение: определите ctor для вашего класса.Убедитесь, что определение либо видно из заголовочного файла support_service.hpp, либо что оно создано для всех возможных комбинаций PATH - LEVEL.

...