带有自定义对象的常量表达式

发布于 2024-08-26 06:38:58 字数 235 浏览 6 评论 0原文

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

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

template <class Foo, Foo foo>
struct Bar {

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

编译器声明 x 不能出现在常量表达式中。为什么呢?在编译时构造该对象的一切都已给出。

I'm trying to use an instant of a custom class as a template parameter.

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

template <class Foo, Foo foo>
struct Bar {

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

The compiler states that x cannot appear in a constant expression. Why that? There is everything given to construct that object at compile time.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

盛装女皇 2024-09-02 06:38:58

你做不到。标准 14.1 说:

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

You can't do it. Standard 14.1 says:

4 A non-type template-parameter shall have one of the following (optionally cv-qualified) types:
— integral or enumeration type,
— pointer to object or pointer to function,
— reference to object or reference to function,
— pointer to member.
5 [ Note: other types are disallowed either explicitly below or implicitly by the rules governing the form of template-arguments
(14.3). —end note ] The top-level cv-qualifiers on the template-parameter are ignored when determining its
type.

逆夏时光 2024-09-02 06:38:58

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

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

As others have pointed out you can't do it. So long as you are not playing meta-programming games, the normal way to pass an actual instance of a class is in the constructor:

template <class Foo>
struct Bar {
    Bar( const Foo & f ) {
      ...
    }
};
墨小沫ゞ 2024-09-02 06:38:58

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

Template parameters can be types, or integral constants. X is a type, but x is not. You also can't use constant floating point values.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文