Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Инстанцирование шаблона, косяк


Автор: Alca 16.4.2011, 22:12
Код

#include <windows.h>

template<HANDLE hFailValueT>
class CxHandleT {
    public:
        HANDLE m_hHandle;

        CxHandleT()
            : m_hHandle(hFailValueT)
        {
        }
};

int main() {
    CxHandleT<NULL> hHandle;

    return 0;
}

Код

could not convert template argument '0' to 'void*'    Test1.cpp    /Test1/src    line 24
invalid type in declaration before ';' token    Test1.cpp    /Test1/src    line 24


Что не так? Студия компилит нормально

Автор: volatile 16.4.2011, 23:33
скорей всего поможет. В начале файла, но после инклудов:
Код

#undef NULL
#define NULL ((void*)0)

Автор: Alca 16.4.2011, 23:39
Код

#include <windows.h>

#undef NULL
#define NULL ((void*)0)

template<HANDLE hFailValueT>
class CxHandleT {
    public:
        HANDLE m_hHandle;

        CxHandleT()
            : m_hHandle(hFailValueT)
        {
        }
};

int main() {
    CxHandleT<NULL> hHandle; //<< error

    return 0;
}


Код

a cast to a type other than an integral or enumeration type cannot appear in a constant-expression    Test1.cpp    /Test1/src    line 27    C/C++ Problem
invalid type in declaration before ';' token    Test1.cpp    /Test1/src    line 27    C/C++ Problem
template argument 1 is invalid    Test1.cpp    /Test1/src    line 27    C/C++ Problem


Автор: volatile 17.4.2011, 00:10
Alca, ну фиг его знает, вот http://stackoverflow.com/questions/1418019/casting-pointer-as-template-argument-comeau-msvc-compile-gcc-fails говорят что мол gcc это не компилит, и это типа правильно.
а msvc спокойно компилит, и это типа не правильно smile

щаз дядьки-знатоки gcc придут, растолкуют, у меня кроме вечно-неправильного msvc ничего под рукой нет  smile 



Автор: xvr 18.4.2011, 12:23
Есть подозрение, что в g++ NULL задефайен как __null

Автор: Alca 18.4.2011, 19:53
Цитата

Есть подозрение, что в g++ NULL задефайен как __null

так оно и есть, и че делать теперь?

Автор: xvr 18.4.2011, 20:13
Цитата(Alca @  18.4.2011,  19:53 Найти цитируемый пост)
так оно и есть, и че делать теперь? 

Ну дык - задефайнить, как просит:
Код

#include <windows.h>
#undef NULL
#define NULL __null

Автор: Alca 19.4.2011, 23:00
Код

//============================================================================
// Name        : Test1.cpp
// Author      : skynowa
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================


//---------------------------------------------------------------------------
#include <windows.h>
#include <iostream>
using namespace std;
//---------------------------------------------------------------------------
#undef  NULL
#define NULL __null
//---------------------------------------------------------------------------
template<HANDLE hFailValueT>
class CxHandleT {
    public:
        HANDLE m_hHandle;

        CxHandleT()
            : m_hHandle(hFailValueT)
        {
        }
};
//---------------------------------------------------------------------------
int main() {
    CxHandleT<NULL> hHandle; //<< error

    return 0;
};
//---------------------------------------------------------------------------

Код

could not convert template argument '0' to 'void*'    Test1.cpp    /Test1/src    line 30    C/C++ Problem
invalid type in declaration before ';' token    Test1.cpp    /Test1/src    line 30    C/C++ Problem


Добавлено через 21 секунду
Дык, не то  smile 

Автор: xvr 20.4.2011, 11:02
Цитата(Alca @  19.4.2011,  23:00 Найти цитируемый пост)
Дык, не то

Увы, мысли кончились  smile 
Один вопрос, а как вы собираетесь ваш CxHandleT<> использовать? Ему кроме NULL в параметр шаблона и передать то нечего  smile 

Автор: Alca 20.4.2011, 11:35
Цитата

Ему кроме NULL в параметр шаблона и передать то нечего  

INVALID_HANDLE_VALUE

Добавлено через 1 минуту и 39 секунд
что-то вроде этого http://www.codeproject.com/KB/wtl/wtlhandle.aspx

Автор: mes 20.4.2011, 11:37
Цитата(Alca @  20.4.2011,  10:35 Найти цитируемый пост)
INVALID_HANDLE_VALUE 

а зачем передавать NULL и INVALID_HANDLE_VALUE  аргументом шаблона ?
в чем смысл ?

Добавлено через 1 минуту и 38 секунд
Цитата(Alca @  20.4.2011,  10:35 Найти цитируемый пост)
что-то вроде этого http://www.codeproject.com/KB/wtl/wtlhandle.aspx 

а, понятно 

Автор: Alca 20.4.2011, 11:40
буду передавать NULL и INVALID_HANDLE_VALUE в конструктор ..

Автор: xvr 20.4.2011, 11:42
Цитата(Alca @  20.4.2011,  11:35 Найти цитируемый пост)
что-то вроде этого http://www.codeproject.com/KB/wtl/wtlhandle.aspx

Угу, имеет смысл  smile 

Автор: mes 20.4.2011, 11:45
такое можно реализовать только разгрузив через прослойку..
способов несколько, но проще будет завести енум для каждого значения, и специализировать для него шаблон..

Добавлено через 1 минуту и 11 секунд
чтоб много не специализировать, можно завести для этого доп структуру..

Добавлено через 10 минут и 36 секунд
вот набросок : http://liveworkspace.org/code/9387f8ebf23d50ec1656e48dd2cd25bc

Автор: mes 20.4.2011, 17:44
Цитата(mes @  20.4.2011,  10:45 Найти цитируемый пост)
вот набросок : 

вместо структуры, можно использовать функцию, чтоб избежать лишнего кода :
http://liveworkspace.org/code/847159fc38fbd91e540f402219b6f3dd

Автор: Alca 3.7.2011, 23:06
http://forums.codeblocks.org/index.php?topic=5692.0

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)