我正在尝试使用自定义类的瞬间作为模板参数。
class X {
public:
X() {};
};
template <class Foo, Foo foo>
struct Bar {
};
const X x;
Bar<X, x> foo;
编译器声明x
不能出现在常量表达式中。为什么?在编译时有一些东西可以构造该对象。
答案 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
不是。您也不能使用常量浮点值。