Постоянное выражение с пользовательским объектом

StackOverflow https://stackoverflow.com/questions/2521869

Вопрос

Я пытаюсь использовать 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 не является.Вы также не можете использовать постоянные значения с плавающей запятой.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top