Постоянное выражение с пользовательским объектом - PullRequest
1 голос
/ 26 марта 2010

Я пытаюсь использовать момент пользовательского класса в качестве параметра шаблона.

class X {
public:
  X() {};
};

template <class Foo, Foo foo>
struct Bar {

};
const X x;
Bar<X, x> foo;

Компилятор утверждает, что x не может появляться в константном выражении. Почему так? Есть все, что нужно для создания этого объекта во время компиляции.

Ответы [ 3 ]

7 голосов
/ 26 марта 2010

Вы не можете сделать это. Стандарт 14.1 гласит:

4 Нетипизированный шаблон-параметр должен иметь один из следующих (необязательно квалифицированных cv) типов:
- целочисленный или перечислимый тип,
- указатель на объект или указатель на функцию,
- ссылка на объект или ссылка на функцию,
- указатель на член.
5 [Примечание: другие типы запрещены либо явно ниже, либо неявно правилами, определяющими форму аргументов шаблона (14.3). - конец примечания] cv-квалификаторы верхнего уровня в параметре шаблона игнорируются при определении его тип.

0 голосов
/ 26 марта 2010

Как уже отмечали другие, вы не можете этого сделать. Пока вы не играете в игры метапрограммирования, нормальный способ передать фактический экземпляр класса в конструкторе:

template <class Foo>
struct Bar {
    Bar( const Foo & f ) {
      ...
    }
};
0 голосов
/ 26 марта 2010

Параметры шаблона могут быть типами или интегральными константами. X - это тип, а x - нет. Вы также не можете использовать постоянные значения с плавающей запятой.

...