Постоянное выражение с пользовательским объектом
-
22-09-2019 - |
Вопрос
Я пытаюсь использовать instant пользовательского класса в качестве параметра шаблона.
class X {
public:
X() {};
};
template <class Foo, Foo foo>
struct Bar {
};
const X x;
Bar<X, x> foo;
Компилятор утверждает , что x
не может отображаться в постоянном выражении.Почему это?Существует все необходимое для создания этого объекта во время компиляции.
Решение
Ты не можешь этого сделать.Стандарт 14.1 гласит:
4 Параметр шаблона, не относящийся к типу, должен иметь один из следующих типов (необязательно с указанием cv):
— интегральный или перечислительный тип,
— указатель на объект или указатель на функцию,
— ссылка на объект или на функцию,
— указатель на участника.
5 [ Примечание:другие типы запрещены либо явно, приведенными ниже, либо неявно правилами, регулирующими форму шаблон-аргументы (14.3).—примечание в конце ] cv-квалификаторы верхнего уровня в параметре шаблона игнорируются при определении его типа.
Другие советы
Как отмечали другие, вы не можете этого сделать.Пока вы не играете в игры метапрограммирования, обычный способ передать реальный экземпляр класса — через конструктор:
template <class Foo>
struct Bar {
Bar( const Foo & f ) {
...
}
};
Параметры шаблона могут быть типами или целочисленными константами. X
это тип, но x
не является.Вы также не можете использовать постоянные значения с плавающей запятой.