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

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)。末端注意事项】确定何时在模板参数中的顶级cv修饰符被忽略了   类型。

其他提示

正如其他人所指出的,你不能做到这一点。只要你是不是打的元编程游戏,正常的方式来传递一个类的实际实例是在构造函数中:

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

模板参数可以是类型或积分常数。 X是一种类型,但x不是。也可以不使用恒定浮点值。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top