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

问题描述:

我实现了用于记录的Singleton类。我声明了logging_instance_的静态类别名称support_service::logging_service上只创建一个实例。 support_service::logging_service类的 Service_logging呼叫实例,其declear静态变量::logging_instance_但显示错误对Singleton类的静态成员函数的未定义引用

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();                      
...                                             
} 
+0

你不能正确格式化你的代码吗?你不知道它有多严重吗? – Nawaz 2012-03-25 07:32:08

+2

另外,使用单身人士 - >不要同情。 – Puppy 2012-03-25 07:34:08

我注意到的一件事是,您没有一个用于logging_service或service_logging构造函数的主体,是否可以从发布的代码中排除?

这就是我能从代码中发现的不幸的,如果有一些部分缺失,请添加它们以便我可以进一步了解。

+0

你的意思是ctor在''support_service :: logging_service''中,对吗? – 2012-03-25 10:57:20

+0

抱歉,这是我的意思。 – josephthomas 2012-03-25 17:29:13

声明在头文件support_service.hpp的构造函数support_service::logging_service<PATH,LEVEL>::logging_service(第14行),甚至在同一个头文件(24行)称其为不明PATHLEVEL。然而,你没有提供一个定义,所以当然你会得到一个未定义的引用错误,你还有什么别的?

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