自定义对象的常量表达式

时间:2010-03-26 08:21:09

标签: c++ templates constant-expression

我正在尝试使用自定义类的瞬间作为模板参数。

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

template <class Foo, Foo foo>
struct Bar {

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

编译器声明x不能出现在常量表达式中。为什么?在编译时有一些东西可以构造该对象。

3 个答案:

答案 0 :(得分:7)

你不能这样做。标准14.1说:

  

4 非类型模板参数应具有以下之一(可选择cv限定)类型:
   - 整数或枚举类型,
   - 指向对象的指针或指向函数的指针,
   - 引用对象或引用函数,
   - 指向成员的指针    5 [注意:管理模板参数形式的规则明确地下面或隐式地禁止其他类型   (14.3)。 -end note]模板参数的顶级cv限定符在确定时忽略   类型。

答案 1 :(得分:0)

正如其他人指出你做不到的那样。只要你不玩元编程游戏,传递类的实际实例的常规方法是在构造函数中:

template <class Foo>
struct Bar {
    Bar( const Foo & f ) {
      ...
    }
};

答案 2 :(得分:-1)

模板参数可以是类型或整数常量。 X是一种类型,但x不是。您也不能使用常量浮点值。