【发布时间】:2019-08-30 04:07:55
【问题描述】:
晚上好,
我必须用 constexpr 函数实现一个类,该函数在头文件中返回一个类成员。该成员是 const 并在我的构造函数中设置,因此稍后在程序中不会更改。
头文件实现:
//Creates a PreAllocString object
#define CREATE (varName,size) {\
char string##varName##[size] {'\0'};\
PreAllocString varName (string##varName##, size);\
}
class PreAllocString
{
private:
char* string;
const std::size_t size;
std::size_t length = 0;
operator const char *() const;
operator const void *() const;
const char & operator [] (const int idx);
public:
//Constructor
PreAllocString (char* string, const std::size_t size);
.
.
.
CPP 文件实现:
#include "PreAllocString.h"
//Constructor
PreAllocString::PreAllocString (char* string, const std::size_t size) : string(string), size(size) {
if (string != nullptr) {
this->Empty();
}
}
.
.
.
我的编译器总是显示:
In file included from src/PreAllocString.cpp:2:0:
include/PreAllocString.h:30:27: error: enclosing class of constexpr non-static member function ‘std::size_t PreAllocString::SizeOf()’ is not a literal type
constexpr std::size_t SizeOf () {
^
include/PreAllocString.h:11:7: note: ‘PreAllocString’ is not literal because:
class PreAllocString
^
include/PreAllocString.h:11:7: note: ‘PreAllocString’ is not an aggregate, does not have a trivial default constructor, and has no constexpr constructor that is not a copy or move constructor
我做错了什么?
【问题讨论】:
-
了解Literal Types。或者只是阅读您粘贴的错误消息。
-
这是什么,C?在 C++ 中,如果可以的话,您希望远离使用宏定义来创建任何东西,更不用说使用宏连接了。试试它们在编译时构建的模板,应该能满足你的要求。
-
@Deduplicator 我已经阅读了 cppreference page about literals/constexpr 并试图了解什么是文字类型,我也尝试使用 int 类型而不是 size_t 因为这是文字类型(如果我做对了吗?),但它没有帮助。
-
封闭类必须是文字类型。错误消息的含义非常明确。
-
@Tzalumen 我的教授希望我们使用“CREATE”Makro,它是一个嵌入式系统讲座。我对模板一无所知,我们必须将代码分发到周三。他说没有模板也可以解决问题。是否有解决该问题的方法或没有其他方法?
标签: c++ constructor constexpr