1

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

class X {
public:
  X() {};
};

template <class Foo, Foo foo>
struct Bar {

};
const X x;
Bar<X, x> foo;

编译器指出x不能出现在常量表达式中。为什么?在编译时构造该对象所需的一切。

4

3 回答 3

7

你不能这样做。标准 14.1 说:

4非类型模板参数应具有以下类型之一(可选 cv 限定):
— 整数或枚举类型,
— 对象指针或函数指针,
— 对象引用或函数引用,
— 成员指针.
5 [注意:其他类型在下面明确地或被管理模板参数形式的规则隐含地禁止 (14.3)。—end note ] 模板参数上的顶级 cv 限定符在确定其类型时会被忽略。

于 2010-03-26T08:31:26.797 回答
0

正如其他人指出的那样,你不能这样做。只要您不玩元编程游戏,传递类的实际实例的正常方法是在构造函数中:

template <class Foo>
struct Bar {
    Bar( const Foo & f ) {
      ...
    }
};
于 2010-03-26T09:33:43.100 回答
-1

模板参数可以是类型,也可以是整数常量。 X是一种类型,但x不是。您也不能使用常量浮点值。

于 2010-03-26T08:32:58.050 回答