Как преодолеть ограничение GCC "не удалось преобразовать аргумент шаблона '0' в 'Foo *'"? - PullRequest
1 голос
/ 09 ноября 2008

Предположим, у меня есть такой код:

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.

Ответы [ 5 ]

3 голосов
/ 09 ноября 2008

Переосмысление вашего кода, вероятно, лучший способ обойти это. Нить, на которую вы ссылаетесь, включает в себя четкую цитату из стандарта, указывающую, что это недопустимо.

2 голосов
/ 10 ноября 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.

2 голосов
/ 09 ноября 2008

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

0 голосов
/ 09 ноября 2008

@ Дэн Олсон: кажется, что есть довольно простой обходной путь.

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

0 голосов
/ 09 ноября 2008

Вы пробовали:

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

?

или reinterpret_cast (0)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...