VC++, шаблонные классы, C2649
От: Tujh Голландия  
Дата: 28.04.10 06:41
Оценка:
Здравствуйте.

Столкнулся с небольшим недопониманием между мной и компилятором:
    // basic singleton class
    template <typename _Tp>
    class singleton_t:
        private boost::noncopyable
    {
    public:
        // get pointer to instance
        static _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 instance
    template <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++ все работало — буду благодарен
Re: VC++, шаблонные классы, C2649
От: kvasya  
Дата: 28.04.10 06:50
Оценка:
Здравствуйте, Tujh, Вы писали:

T>Здравствуйте.


T>Столкнулся с небольшим недопониманием между мной и компилятором:


2008 студия — нормально.
Может банальность какая? У тебя там не вкралось ";" лишней?
Re: VC++, шаблонные классы, C2649
От: kvasya  
Дата: 28.04.10 06:51
Оценка:
Здравствуйте, Tujh, Вы писали:

T>Здравствуйте.


T>Столкнулся с небольшим недопониманием между мной и компилятором:


Кстати, а что это за архитектурный маневр с приватным наследованием и тут же объявлением дружбы? Никогда не встречал.
Re[2]: VC++, шаблонные классы, C2649
От: Tujh Голландия  
Дата: 28.04.10 07:00
Оценка:
Здравствуйте, kvasya, Вы писали:
K>Кстати, а что это за архитектурный маневр с приватным наследованием и тут же объявлением дружбы? Никогда не встречал.
Это эксперименты и их последствия, до начала "мозгового штурма" было публичное наследие

Разобрался таки...
фишка оказалась занятной,
для GCC корректный код
friend class uwc::singleton_t<typename _Tp>;

а для VC++ 8.0 (2005)
friend uwc::singleton_t<typename _Tp>;

т.е. достаточно просто удалить ключевое слово class для M$, но тогда отказывается собирать GCC.
Пошел думать дальше.
Re: VC++, шаблонные классы, C2649
От: Bell Россия  
Дата: 28.04.10 07:12
Оценка:
Здравствуйте, Tujh, Вы писали:

VC7.1 и VC8, который на Dinkum Exam, скомпилили без вопросов

А вообще ключевое слово typename при объявлении друга лишнее — попробуй его убрать:
friend class singleton_t<_Tp>;
Любите книгу — источник знаний (с) М.Горький
Re[2]: VC++, шаблонные классы, C2649
От: Tujh Голландия  
Дата: 28.04.10 08:02
Оценка:
Здравствуйте, Bell, Вы писали:
B>VC7.1 и VC8, который на Dinkum Exam, скомпилили без вопросов
SP1 для восьмой студии установлен ?
Может быть в этом причина.
Работаю в студии 2005 без SP из-за требований совместимости run-time библиотек

B>А вообще ключевое слово typename при объявлении друга лишнее — попробуй его убрать:

B>
B>friend class singleton_t<_Tp>;
B>

убрал, этим я пытался с 2005 студией договориться
Re[3]: VC++, шаблонные классы, C2649
От: Bell Россия  
Дата: 28.04.10 08:16
Оценка:
Здравствуйте, 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 студией договориться

И как, договорился?
Любите книгу — источник знаний (с) М.Горький
Re[4]: VC++, шаблонные классы, C2649
От: Tujh Голландия  
Дата: 28.04.10 08:35
Оценка:
Здравствуйте, Bell, Вы писали:
B>И как, договорился?
Нет.
Сейчас проверил под 2008 — с class работает, 2005 — не хочет
Смущает, что на social.msdn.microsoft.com
первым же ответом идет предложение удалить class

Нашел еще вот тут тему, где подобную проблему решили так (применительно к моему случаю):
friend typename singleton_t<_Tp>;

у меня тоже сработало, пока остановлюсь на этом варианте, вроде и GCC его принимает.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.