gpt4 book ai didi

c++ - 是否可以在 header 中声明 constexpr 类并在单独的 .cpp 文件中定义它?

转载 作者:太空宇宙 更新时间:2023-11-04 13:35:03 25 4
gpt4 key购买 nike

我在文件 Dimension.h 中定义了一个类 Dimension(就像我所有的类一样):

class Dimension
{
public:

constexpr Dimension() noexcept;

constexpr Dimension(int w, int h) noexcept;

int width;
int height;

};

我想我可以像在我所有的类(class)中一样,将定义放在一个单独的 Dimension.cpp 中:

#include "Dimension.h"

constexpr Dimension::Dimension() noexcept : width(0), height(0) {}

constexpr Dimension::Dimension(int w, int h) noexcept : width(w), height(h) {}

但是当我尝试使用这个类时,编译器告诉我:

警告:内联函数“constexpr Dimension::Dimension()”已使用但从未定义

链接时:

对“pong::graphics::Dimension::Dimension()”的 undefined reference

(与其他构造函数相同)

如果我像这样在 header 中定义类:

class Dimension
{
public:

constexpr Dimension() noexcept : width(0), height(0) {}

constexpr Dimension(int w, int h) noexcept : width(w), height(h) {}

int width;
int height;

};

并省略 .cpp 文件,一切正常。

我正在使用 GCC 4.9.2。为什么单独定义不起作用?

最佳答案

如果 constexpr 函数没有在头文件中定义,编译器在编译所有其他源文件时看不到 constexpr 函数的定义。

显然,如果它看不到函数的定义,就无法在编译时执行计算它们的必要步骤。因此,所有 constexpr 函数都必须在使用它们的任何地方定义。

感谢@IgorTandetnik:
[dcl.constexpr] §7.1.5/2

constexpr functions and constexpr constructors are implicitly inline.

[basic.def.odr] §3.2/4

An inline function shall be defined in every translation unit in which it is odr-used.

关于c++ - 是否可以在 header 中声明 constexpr 类并在单独的 .cpp 文件中定义它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29870750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com