未定义引用Singleton类的静态成员函数

时间:2012-03-25 07:28:36

标签: c++ templates singleton metaprogramming

我实现Singleton类进行日志记录。我声明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 个答案:

答案 0 :(得分:1)

我注意到的一件事是你没有为logging_service或service_logging构造函数设置一个主体,是否可以从发布的代码中省略?

不幸的是,这是我能从你的代码中找到的所有内容,如果有一些部分缺失,那么请添加它们以便我可以进一步了解。

答案 1 :(得分:0)

您在头文件support_service.hpp(第14行)中声明了ctor support_service::logging_service<PATH,LEVEL>::logging_service,甚至在同一个头文件(第24行)中为未指定的PATHLEVEL调用它。但是,你没有提供定义,所以当然你得到一个未定义的引用错误,你还有什么想法呢?

解决方案:为您的班级定义ctor。确保从头文件support_service.hpp中可以看到该定义,或者为所有可能的PATH - LEVEL组合实例化该定义。