Столкнулся с небольшим недопониманием между мной и компилятором:
// basic singleton classtemplate <typename _Tp>
class singleton_t:
private boost::noncopyable
{
public:
// get pointer to instancestatic _Tp* instance()
{
if (!m_pthis)
m_pthis = new _Tp;
return m_pthis;
}
//----------------------------------------------------------------------protected:
singleton_t() { /* empty */ };
//----------------------------------------------------------------------
~singleton_t()
{
delete m_pthis;
};
//----------------------------------------------------------------------private:
static _Tp * m_pthis; // pointer to instance
}; /* class singletone_t */
//--------------------------------------------------------------------------
// initialize pointer to instancetemplate <typename _Tp> _Tp* singleton_t<_Tp>::m_pthis = NULL;
//--------------------------------------------------------------------------
(...)
//template<typename _Tp>
class application_t:
private singleton_t<_Tp> // <-- тут все нормально
{
public:
//virtual ~application_t() { /* empty */ }
//--------------------------------------------------------------------------protected:
//virtual int main() = 0;
//--------------------------------------------------------------------------
//
application_t()
{
}
//--------------------------------------------------------------------------private:
//friend class singleton_t<typename _Tp>; // <-- а тут error C2649: 'singleton_t<_Tp>' : is not a 'class'
//--------------------------------------------------------------------------
//int _main()
{
return main();
}
//--------------------------------------------------------------------------
};
//------------------------------------------------------------------------------
(...)
class my_application:
public application_t<my_application>
{
virtual int main()
{
return 0;
}
};
компилятор GCC 4 (как в реализации для Linux, так и в Cygwin) компилирует этот код и исполняемый файл работает как задумывалось.
А MSVC++ (MSVS2005) отказывается ссылаясь на ошибку С2649
Пока поиски на просторах интернетов результатов не дали, но я их не прекращаю.
Если кто ткнет носом в то, что я написал неправильно, или как поправить что бы и под VC++ все работало — буду благодарен
Здравствуйте, kvasya, Вы писали: K>Кстати, а что это за архитектурный маневр с приватным наследованием и тут же объявлением дружбы? Никогда не встречал.
Это эксперименты и их последствия, до начала "мозгового штурма" было публичное наследие
Разобрался таки...
фишка оказалась занятной,
для GCC корректный код
friend class uwc::singleton_t<typename _Tp>;
а для VC++ 8.0 (2005)
friend uwc::singleton_t<typename _Tp>;
т.е. достаточно просто удалить ключевое слово class для M$, но тогда отказывается собирать GCC.
Пошел думать дальше.
Здравствуйте, Bell, Вы писали: B>VC7.1 и VC8, который на Dinkum Exam, скомпилили без вопросов
SP1 для восьмой студии установлен ?
Может быть в этом причина.
Работаю в студии 2005 без SP из-за требований совместимости run-time библиотек
B>А вообще ключевое слово typename при объявлении друга лишнее — попробуй его убрать: B>
Здравствуйте, Tujh, Вы писали:
T>SP1 для восьмой студии установлен ? T>Может быть в этом причина. T>Работаю в студии 2005 без SP из-за требований совместимости run-time библиотек
Значение _MSC_VER — 1400, похоже, что без SP.
B>>А вообще ключевое слово typename при объявлении друга лишнее — попробуй его убрать: B>>
B>>friend class singleton_t<_Tp>;
B>>
T>убрал, этим я пытался с 2005 студией договориться
Здравствуйте, Bell, Вы писали: B>И как, договорился?
Нет.
Сейчас проверил под 2008 — с class работает, 2005 — не хочет
Смущает, что на social.msdn.microsoft.com
первым же ответом идет предложение удалить class
Нашел еще вот тут тему, где подобную проблему решили так (применительно к моему случаю):
friend typename singleton_t<_Tp>;
у меня тоже сработало, пока остановлюсь на этом варианте, вроде и GCC его принимает.