我正在尝试使用自定义类的瞬间作为模板参数。
class X {
public:
X() {};
};
template <class Foo, Foo foo>
struct Bar {
};
const X x;
Bar<X, x> foo;
编译器指出x
不能出现在常量表达式中。为什么?在编译时构造该对象所需的一切。
我正在尝试使用自定义类的瞬间作为模板参数。
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)。—end note ] 模板参数上的顶级 cv 限定符在确定其类型时会被忽略。
正如其他人指出的那样,你不能这样做。只要您不玩元编程游戏,传递类的实际实例的正常方法是在构造函数中:
template <class Foo>
struct Bar {
Bar( const Foo & f ) {
...
}
};
模板参数可以是类型,也可以是整数常量。 X
是一种类型,但x
不是。您也不能使用常量浮点值。