Запрещает ли стандарт делать перегруженные функции с разными non-type template parameters? Перегружать специализации разрешает (14.5.5.1.1), отличать функции с non-type template parameters от функций с типовым параметром — тоже (14.5.5.1.4), а вот так можно?
Здравствуйте, Тот кто сидит в пруду, Вы писали:
ТКС>Запрещает ли стандарт делать перегруженные функции с разными non-type template parameters? Перегружать специализации разрешает (14.5.5.1.1), отличать функции с non-type template parameters от функций с типовым параметром — тоже (14.5.5.1.4), а вот так можно?
ТКС>
Здравствуйте, Тот кто сидит в пруду, Вы писали:
ТКС>Здравствуйте, wander, Вы писали:
W>>С компилятором все нормально. Ты посмотри, чем на само деле являются HANDLE и HKEY и станет понятно все сразу.
ТКС>Они, естественно, разные.
Это в MSVC они разные, а у меня (mingw) вот, например, одинаковые. Но проблема все равно не в этом. ТКС>Так что мимо:
Мимо. Согласен.
ТКС>
W>Mingw 4.4 компилит. Исполняется как того и ожидается.
Та же ошибка:
1>c:\projects\test141srlz\main.cpp(51) : error C2440: 'specialization' : cannot convert from 'bool (__cdecl *)(void *)' to 'int (__cdecl *const )(void *)'
1> This conversion requires a reinterpret_cast, a C-style cast or function-style cast
1>c:\projects\test141srlz\main.cpp(51) : error C2973: 'DestroyHandle' : invalid template argument 'bool (__cdecl *)(void *)'
1> c:\projects\test141srlz\main.cpp(31) : see declaration of 'DestroyHandle'
1>c:\projects\test141srlz\main.cpp(51) : error C2440: 'initializing' : cannot convert from 'overloaded-function' to 'void (__cdecl *)(void *)'
1> None of the functions with this name in scope match the target type
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[5]: non-type template parameters and overloading
Здравствуйте, Тот кто сидит в пруду, Вы писали:
ТКС>Запрещает ли стандарт делать перегруженные функции с разными non-type template parameters? Перегружать специализации разрешает (14.5.5.1.1), отличать функции с non-type template parameters от функций с типовым параметром — тоже (14.5.5.1.4), а вот так можно?
Попробовал с более простыми типами.
VC8 и VC9 заругались, g++ 3.4.4 съел
#include <iostream>
#define __FUNCSIG__ __PRETTY_FUNCTION__
template<int* p> void foo() { std::cout << __FUNCSIG__ << " " << *p << std::endl; } // (1)template<char* p> void foo() { std::cout << __FUNCSIG__ << " " << p << std::endl; } // (2)template<const char* p> void foo() { std::cout << __FUNCSIG__ << " " << p << std::endl; } // (3)int x = 12345;
char y[] = "hello";
extern const char z[] = "world"; // без extern подразумевается static, ибо constint main()
{
foo<&x>();
foo<y>(); // неоднозначность между (2) и (3); стоит закомментировать любую - неоднозначность исчезнет
foo<z>(); // естественно, закомментировать (3) означает создать ошибку здесь
}