我有一个linux项目的单身人士图书馆,我试图移植到Windows。 当我尝试编译时,它与错误
语法错误:标识符“rpSingleton”
错误来自以下代码部分:
template <typename T> inline T& Q::Singleton<T>::Instance() { Singleton<T>*& rp_singleton(rpSingleton()); //ERRORS HERE if (0 == rp_singleton) { rp_singleton = new Singleton<T>; } return rp_singleton->mInstance; }
以下是整个文件供参考。 任何想法有什么不对?
#ifndef Q_SINGLETON_H #define Q_SINGLETON_H // SYSTEM INCLUDES #include <boost/noncopyable.hpp> // PROJECT INCLUDES // LOCAL INCLUDES #include "NonDerivable.h" // NAMESPACES namespace Q { template <typename T> class Singleton; } // FORWARD REFERENCES namespace Q { template <typename T> void InstanceCleanup(); } template <typename T> class Q::Singleton : private boost::noncopyable , private virtual Qf::NonDerivable { // FRIENDS // Allow only T specialization of Instance be a friend friend T& Instance<T>(); // Allow only the T specialization of Instance be a friend friend void InstanceCleanup<T>(); public: protected: private: /// The single object T mInstance; /// Wrapper method of a static pointer to support instance and clean up /// static Singleton<T>*& rpSingleton(); /// Constructor is private, must use Instance Method to use the object /// Singleton(); /// Get the Instance of the Singleton /// \return The Instance static T& Instance(); /// A way to free this singleton's resources before program termination /// static void CleanUp(); }; // INLINE METHODS template <typename T> inline T& Q::Singleton<T>::Instance() { Singleton<T>*& rp_singleton(rpSingleton()); if (0 == rp_singleton) { rp_singleton = new Singleton<T>; } return rp_singleton->mInstance; } template <typename T> inline void Q::Singleton<T>::CleanUp() { delete rpSingleton(); rpSingleton() = 0; } template <typename T> inline Q::Singleton<T>*& Q::Singleton<T>::rpSingleton() { static Singleton<T>* sp_singleton(0); return sp_singleton; } template <typename T> inline Q::Singleton<T>::Singleton() { } template <typename T> inline T& Q::Instance() { return Singleton<T>::Instance(); } template <typename T> inline void Q::InstanceCleanup() { Singleton<T>::CleanUp(); } // NON-INLINE METHODS (TEMPLATE CLASSES ONLY!!!!) #endif // SINGLETON_H
我想你是从C ++ FAQ Lite遇到这个问题的。 基本上,你实际上并没有初始化它。 就我个人而言,我感到惊讶的是,所讨论的行甚至完全是“合法的”(我的大脑正在融入参考指针),但是请看一下链接。 它显示了编译器如何解释(或错误解释)某些类型的初始化语句。
我想你想要做的是如下所示:
Singleton<T>*& rp_singleton = rpSingleton();
所以阅读链接。 基本上我认为编译器认为你正在调用一个函数,或者什么的。 无论哪种方式,关于修复的线…我想。
编辑:你也可以看看这个部分处理引用。
将其更改为:
Singleton<T>*& rp_singleton = rpSingleton();
修复它。 但是这有什么意义吗?