Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 带有自定义对象的常量表达式_C++_Templates_Constant Expression - Fatal编程技术网

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转换函数。