Как да се преодолее GCC ограничението не може да преобразува аргумента на шаблона '0' в 'Foo*'?

Да предположим, че имам код като този:

template<class T, T initial_t> class Bar {
  // something
}

И след това опитайте да го използвате по следния начин:

Bar<Foo*, NULL> foo_and_bar_whatever_it_means_;

GCC излиза с грешка (на горния ред):

не можа да преобразува аргумента на шаблона '0' в 'Foo*'

Намерих тази тема: http://gcc.gnu.org/ml/gcc-help/2007-11/msg00066.html, но трябва да използвам NULL в този случай (добре, вероятно бих могъл да преработя - но няма да е тривиално; някакви предложения?). Опитах се да преодолея проблема, като създадох променлива със стойност NULL, но GCC все още се оплаква, че предавам променлива, а не адрес на променлива като аргумент на шаблона. И препратката към променлива, инициализирана с ctor по подразбиране, няма да бъде същата като NULL.


person Paweł Hajdan    schedule 09.11.2008    source източник


Отговори (5)


Преосмислянето на вашия код е може би най-добрият начин да го заобиколите. Темата, към която сте се свързали, включва ясен цитат от стандарта, който показва, че това не е позволено.

person Dan Olson    schedule 09.11.2008

За да приемете Bar<Foo, NULL>, трябва

template <typename T, int dummy> class Bar; /* Declared but not defined */
template <typename T> class Bar <T,NULL> { /* Specialization */ };

тъй като typeof(NULL)==int.

person MSalters    schedule 10.11.2008

Изглежда, че това е същият проблем като предаването на низов литерал като параметър на шаблон без тип: това не е разрешено. Указател към обект е разрешен като параметър на шаблона, ако обектът има външна връзка: това гарантира уникалността на типа.

person Nicola Bonelli    schedule 09.11.2008

Опитвали ли сте:

Bar<Foo*, (Foo*)NULL> foo_and_bar_whatever_it_means_;

?

или reinterpret_cast(0)?

person Assaf Lavie    schedule 09.11.2008

@Dan Olson: изглежда има доста лесно решение.

Създайте родителски клас само с един параметър на шаблона. Добавете виртуална функция, връщаща T. За базов клас трябва да бъде твърдо кодиран да бъде NULL. За извличане на клас ще върне втория параметър на шаблона.

person Paweł Hajdan    schedule 09.11.2008