Russian Qt Forum
Май 08, 2024, 02:21 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: MinGW и указатель как аргумент шаблона  (Прочитано 5228 раз)
System
Гость
« : Февраль 04, 2015, 11:00 »

Имеется следующий код:
Код
C++ (Qt)
template<class T, T t> class TmplTest
{
 
};
 
int var = 0;
 
int main()
{
TmplTest<void*, nullptr>     tmplTest1;  // OK
TmplTest<int*, &var>         tmplTest2;  // OK
TmplTest<void*, (void*)(-1)> tmplTest3;  // FAIL in MinGW!!!
 
return 0;
}
 
Код прекрасно компилируется в vc2013, но не в MinGW (mingw-builds i686-4.9.2-release-posix-sjlj-rt_v3-rev1). Выдаёт ошибку:
Код:
main.cpp: In function 'int main()':
main.cpp:14:29: error: '4294967295u' is not a valid template argument for 'void*' because it is not the address of a variable
  TmplTest<void*, (void*)(-1)> tmplTest3;  // FAIL!!!
                             ^
main.cpp:14:40: error: invalid type in declaration before ';' token
  TmplTest<void*, (void*)(-1)> tmplTest3;  // FAIL!!!                                ^
Это глюк или так и должно быть? И как для MinGW передать невалидный указатель?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Февраль 04, 2015, 11:04 »

А нулевой указатель нельзя?(Не заметил nullptr)
Зачем вообще это нужно?
« Последнее редактирование: Февраль 04, 2015, 11:14 от Пантер » Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
System
Гость
« Ответ #2 : Февраль 04, 2015, 11:20 »

Это упрощённый пример. Нужно следующее:

Код
C++ (Qt)
template<typename HandleType = HANDLE,
        WINBOOL (WINAPI * destructor)(HandleType) = CloseHandle,
        HandleType defaultValue = INVALID_HANDLE_VALUE>
class UniqueHandle
{
...
}
 

Это - обёртка над дескрипторами Windows. INVALID_HANDLE_VALUE MinGW не жрёт, ругается.
Записан
Swa
Самовар
**
Offline Offline

Сообщений: 170


Просмотр профиля
« Ответ #3 : Февраль 04, 2015, 12:06 »

Стандарт:
Цитировать
For C++ 11, non-type template arguments are restricted to the following (§14.3.2/1):

    A template-argument for a non-type, non-template template-parameter shall be one of:

        for a non-type template-parameter of integral or enumeration type, a converted constant expression (5.19) of the type of the template-parameter; or
        the name of a non-type template-parameter; or
        a constant expression (5.19) that designates the address of an object with static storage duration and external or internal linkage or a function with external or internal linkage, including function templates and function template-ids but excluding non-static class members, expressed (ignoring parentheses) as & id-expression, except that the & may be omitted if the name refers to a function or array and shall be omitted if the corresponding template-parameter is a reference; or
        a constant expression that evaluates to a null pointer value (4.10); or
        a constant expression that evaluates to a null member pointer value (4.11); or
        a pointer to member expressed as described in 5.3.1.

Т.е. аргументы шаблона должны существовать и быть константными на момент компиляции.
Записан
System
Гость
« Ответ #4 : Февраль 04, 2015, 12:26 »

Мда... Получается, что можно только глобальную переменную или NULL? Мне это ограничение кажется несколько нелогичным.

То есть GCC более строго следует стандарту а VC менее строго и разрешает то, чего быть не должно?

Придётся извращаться через ULONG...
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Февраль 04, 2015, 12:27 »

То есть GCC более строго следует стандарту а VC менее строго и разрешает то, чего быть не должно?
А для тебя это новость? О_о
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
System
Гость
« Ответ #6 : Февраль 04, 2015, 14:41 »

А для тебя это новость? О_о
Вообще-то да...  В замешательстве
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #7 : Февраль 04, 2015, 14:45 »

А для тебя это новость? О_о
Вообще-то да...  В замешательстве
У нас в команде из 6 человек на Линухе сидят двое (в том числе я). Частенько приходится вычищать ворнинги и ошибки сборки после того, как коллеги-виндузятники коммитят свой кот, собирающийся под студией.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #8 : Февраль 04, 2015, 15:04 »

У нас в команде из 6 человек на Линухе сидят двое (в том числе я). Частенько приходится вычищать ворнинги и ошибки сборки после того, как коллеги-виндузятники коммитят свой кот, собирающийся под студией.
Не предлагали им clang?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #9 : Февраль 04, 2015, 15:06 »

У нас в команде из 6 человек на Линухе сидят двое (в том числе я). Частенько приходится вычищать ворнинги и ошибки сборки после того, как коллеги-виндузятники коммитят свой кот, собирающийся под студией.
Не предлагали им clang?
Чувак, виндузятники-студийники. Какой шланг? Какая Мингва?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #10 : Февраль 04, 2015, 15:32 »

Ну, втихоря сделать подлог toolchain Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.172 секунд. Запросов: 23.