Даункинг в шаблонах - PullRequest
2 голосов
/ 23 ноября 2010

Почему при наличии:

template<double&& value>
struct X
{
};

это не работает:

X<1> not_ok;

, но это работает:

X<1.0> ok;  

Не должно быть ортогональностив поведении?Если я могу передать int в fnc, взяв double в качестве аргумента, почему я не могу сделать это с помощью <> (template)?Есть ли способ обойти это (мне нужно это сделать один шаблон (вместо двух с разными именами), который позволит мне взять двойной && или int &&)?Я пытался передать класс, который преобразование ctor из int в этот класс, но это приводит к сбою компилятора VS.Я не знаю что делатьЯ застрял.Я также попробовал специализацию:

template<class T>
struct X;

template<>
struct X<double&&>
{
};

template<>
struct X<int&&>
{
};

, но неожиданный сюрприз не работает.Зачем?У меня есть основной шаблон, и затем я хочу специализировать его на определенных типах, почему он не работает?

Ответы [ 2 ]

2 голосов
/ 02 декабря 2010

В соответствии с N3126 (окончательный вариант) (14.1 / 4):

Нетипизированный шаблон-параметр должен иметь одно из следующих значений (необязательно с квалификацией cv)) типы:

  • целочисленный тип или тип перечисления,
  • указатель на объект или указатель на функцию,
  • lvalue ссылка на объект или lvalue ссылка на функцию, (выделение моя)
  • указатель на элемент.

Итак, как вы можете видеть, rvalue ссылается нане допускаются вообще как параметры шаблона.Если вы хотите преодолеть ограничение, что параметры шаблона не могут быть double с, почему бы вам не выразить коэффициент загрузки как рациональный:

my_vector<7, 12> ... коэффициент загрузки не менее 7 /12.

Кстати, вы также можете сохранить коэффициент загрузки как константу (или как член), что, вероятно, даст вам меньше раздувания кода и не намного ухудшит производительность.

Вторая проблема, которую выposts (специализация для double&&) - это совершенно другое, поддерживается и работает для меня (с g ++ - 4.5):

template<class T>
struct X;

template<>
struct X<double&&>
{
};

template<>
struct X<int&&>
{
X();
};
X<int&&> a;
/usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 0 has invalid symbol index 12
...
/usr/lib/gcc/i486-linux-gnu/4.5.1/../../../../lib/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
/home/jirka/tmp/ccqJkazZ.o: In function `__static_initialization_and_destruction_0(int, int)':
:(.text+0x1d): undefined reference to `X<int&&>::X()'
1 голос
/ 24 ноября 2010

Я не уверен, что вы можете передать float / double в качестве параметра шаблона, он должен быть только целым числом.Кроме того, числа с плавающей точкой не сохраняются как есть, поэтому 1.0 на самом деле не 1.0, но может быть 0.999999999999.Таким образом, вы не должны использовать числа с плавающей запятой при выполнении сравнения.

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