C++ 带有自定义对象的常量表达式
我试图使用自定义类的一个瞬间作为模板参数C++ 带有自定义对象的常量表达式,c++,templates,constant-expression,C++,Templates,Constant Expression,我试图使用自定义类的一个瞬间作为模板参数 class X { public: X() {}; }; template <class Foo, Foo foo> struct Bar { }; const X x; Bar<X, x> foo; X类{ 公众: X(){}; }; 样板 结构条{ }; 常数X; 巴富; 编译器声明x不能出现在常量表达式中。为什么?在编译时,已经为构造该对象提供了一切。您不能这样做。标准14.1规定: 4非类型模板参数应具有以下类
class X {
public:
X() {};
};
template <class Foo, Foo foo>
struct Bar {
};
const X x;
Bar<X, x> foo;
X类{
公众:
X(){};
};
样板
结构条{
};
常数X;
巴富;
编译器声明
x
不能出现在常量表达式中。为什么?在编译时,已经为构造该对象提供了一切。您不能这样做。标准14.1规定:
4非类型模板参数应具有以下类型之一(可选cv合格):
-整型或枚举型,-指向对象的指针或指向函数的指针,
-引用对象或引用函数,
-指向成员的指针。
5[注意:其他类型的模板参数的形式规则在下面显式或隐式禁止 (14.3)。-结束注释]确定模板参数时,忽略模板参数上的顶级cv限定符 类型
你不能这么做。标准14.1规定: 4非类型模板参数应具有以下类型之一(可选cv合格): -整型或枚举型,
-指向对象的指针或指向函数的指针,
-引用对象或引用函数,
-指向成员的指针。
5[注意:其他类型的模板参数的形式规则在下面显式或隐式禁止 (14.3)。-结束注释]确定模板参数时,忽略模板参数上的顶级cv限定符 类型
模板参数可以是类型,也可以是整型常量
X
是一种类型,但X
不是。也不能使用常量浮点值。模板参数可以是类型,也可以是整型常量X
是一种类型,但X
不是。您也不能使用常量浮点值。正如其他人指出的那样,您不能这样做。只要您不是在玩元编程游戏,传递类的实际实例的正常方法是在构造函数中:
template <class Foo>
struct Bar {
Bar( const Foo & f ) {
...
}
};
模板
结构条{
酒吧(康斯特富福酒店){
...
}
};
正如其他人指出的那样,你做不到。只要您不是在玩元编程游戏,传递类的实际实例的正常方法是在构造函数中:
template <class Foo>
struct Bar {
Bar( const Foo & f ) {
...
}
};
模板
结构条{
酒吧(康斯特富福酒店){
...
}
};
毕竟有很多选择。任何POD(不包括浮点值和动态指针)都可以转换为模板,只是编译器无法自动转换。在C++0x中,我们最终可以将类类型作为参数传递,只要它们具有到整型或枚举类型的constexpr转换函数。毕竟,这是很多选项。任何POD(不包括浮点值和动态指针)都可以转换为模板,但编译器无法自动转换。在C++0x中,我们最终可以将类类型作为参数传递,只要它们具有到整型或枚举类型的constexpr转换函数。