Синтаксическая ошибка в классе Singleton Template при переносе из linux в windows - PullRequest
1 голос
/ 24 марта 2010

У меня есть одноэлементная библиотека из проекта 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

Ответы [ 2 ]

1 голос
/ 24 марта 2010

Я думаю, что вы сталкиваетесь с этим из C ++ FAQ Lite. По сути, вы на самом деле не инициализируете это. Лично я удивлен, что рассматриваемая линия вообще ЮРИДИЧЕСКАЯ (мой мозг тает от ссылки на указатель), но взгляните на ссылку. Он показывает, как компилятор может интерпретировать (или неправильно интерпретировать) определенные виды операторов инициализации.

Я думаю, что вы хотите сделать, это что-то вроде ниже:

Singleton<T>*& rp_singleton = rpSingleton();

Так что прочитайте ссылку. В основном я думаю, что компилятор думает, что вы вызываете функцию или что-то в этом роде. В любом случае, строка об этом исправляет ... Я думаю.

Изменить: вы также можете взглянуть на этот раздел , который имеет дело со ссылками.

0 голосов
/ 24 марта 2010

Меняем это на:

Singleton<T>*& rp_singleton = rpSingleton();

Исправляет это. Но имеет ли это смысл?

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