Как использовать> (больше-чем) внутри параметра шаблона и не получить ошибку синтаксического анализа?
Я хочу только определить функцию, основанную на размере параметра шаблона:
template <class T>
typename std::enable_if<sizeof(T) > 1, void>::type
foobify(T v) {
// ...
}
int main() {
//foobify((unsigned char)30); // should not compile
foobify((long)30);
}
Однако я получаю:
main.cpp:8:41: error: expected unqualified-id before numeric constant
typename std::enable_if<sizeof(T) > 1, void>::type
Это работает, если я вместо этого 1 < sizeof(T)
. Таким образом, я считаю, что GCC думает, что я заканчиваю параметр шаблона, вместо продолжения булевского выражения.
Можно ли использовать >
сам, не обойдя его?
Ответы
Ответ 1
Да, выражения с использованием этого оператора должны быть заключены в скобки. См. [Temp.names]/3:
При анализе списка шаблонов-аргументов первый не-вложенный >
138 принимается за конечный разделитель а не оператор большего размера. [..] [Пример:
template<int i> class X { /* ...*/ };
X< 1>2 > x1; // syntax error
X<(1>2)> x2; // OK
- конец примера]
138) A >
, который включает идентификатор типа dynamic_cast
, static_cast
, reinterpret_cast
или const_cast
или который охватывает template-arguments следующего идентификатора шаблона, считается вложенным для целей этого описания.
Ясно, что это не применяется, если вы используете симметричный аналог этого сравнения, т.е. используя <
, вместо этого - разбор в этом случае недвусмыслен.
Ответ 2
Да, вы должны использовать круглые скобки:
template <class T>
typename std::enable_if<(sizeof(T) > 1), void>::type
foobify(T v) {
// ...
}