【发布时间】:2020-12-13 20:14:37
【问题描述】:
我在一个头文件上有一个class,它的成员在一个 pimpl 类中定义。这个想法是我使用this方法(基本上std::aligned_storage_t和一个指针,但是在声明对象时必须指定类的大小和对齐方式)在堆栈上分配pimpl类。我想让代码交叉编译,所以猜测不是一个选项,因此我定义了 2 个privatestatic constexpr 函数:impl_size 和 impl_align,它们在相应的源文件中定义并且基本上返回 sizeof(pimpl)和alignof(pimpl)。问题是我从 MSVC 收到以下错误(未在其他编译器上测试):
expression must have a constant value -- constexpr function function "Type::impl_size" (declared at line 70) is not defined
第 70 行是在标题中定义 impl_size 的位置。
MCVE:
#include <cstddef>
template <typename T1, std::size_t N1, std::size_t N2>
struct Pimpl;
class Type
{
private:
static constexpr std::size_t impl_size() noexcept; // line 70
static constexpr std::size_t impl_align() noexcept;
struct impl {};
Pimpl<impl, impl_size(), impl_align()> data; // error happens here
};
constexpr std::size_t Type::impl_size() noexcept
{
return sizeof(Type::impl);
}
constexpr std::size_t Type::impl_align() noexcept
{
return alignof(Type::impl);
}
【问题讨论】:
-
请编辑您的帖子并创建一个minimal reproducible example。我们无法修复我们看不到的代码。
-
我添加了一个简约的例子。如果还不够,我很乐意将其“扩展”为更完整的。
-
显然,编译器需要在编译时知道
impl_size()的值,为此它需要在包含header.hpp的任何位置查看其主体。 -
@TerensTare MCVE 必须始终完整。没有例外。从一开始就这样做,这样我们就不会像在每天收到的其他问题上那样来回询问,浪费时间
标签: c++ static c++17 constexpr c++20