Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中模板常量的默认值+;_C++_Templates - Fatal编程技术网

C++ C+中模板常量的默认值+;

C++ C+中模板常量的默认值+;,c++,templates,C++,Templates,我正在尝试将全局缓冲区大小替换为一个可以为测试修改的大小。当前代码类似于: static const uint32_t BUFFER_SIZE = 1 << 8; class BufferWrapper { . . . char buffer_[BUFFER_SIZE]; }; static const uint32_t BUFFER_SIZE = 1 << 8; template <uint_32 SIZE = BUFFER_SIZE> class

我正在尝试将全局缓冲区大小替换为一个可以为测试修改的大小。当前代码类似于:

static const uint32_t BUFFER_SIZE = 1 << 8;

class BufferWrapper {
.
.
.

char buffer_[BUFFER_SIZE];
};
static const uint32_t BUFFER_SIZE = 1 << 8;

template <uint_32 SIZE = BUFFER_SIZE>
class BufferWrapper {
.
.
.

char buffer_[SIZE];
};
但在测试过程中,我可以编写如下内容来测试1KB的缓冲区:

BufferWrapper<1024> test_buf;

C++17中显示的程序没有问题

在C++17之前,即使模板参数列表为空,也必须提供该列表:

BufferWrapper<> test_buf;
BufferWrapper测试;
在这种情况下,可以通过使用类型别名避免更改客户端代码:

template <uint_32 SIZE = BUFFER_SIZE>
class BufferWrapperTemplate;

using BufferWrapper = BufferWrapperTemplate<>;
模板
类缓冲包装器模板;
使用BufferWrapper=BufferWrapperTemplate;
如前所述,从C++17开始,代码就很好了。但是,如果您没有访问权限,您仍然可以绕过将所有现有代码更改为使用
BufferWrapper
而不是
BufferWrapper
的需要

为此,请将
BufferWrapper
重命名为其他名称(例如
BufferWrapperTemplate
),并为默认大小的版本提供类型别名:

template <uint_32 SIZE = BUFFER_SIZE>
class BufferWrapperTemplate {
.
.
.

char buffer_[SIZE];
};

typedef BufferWrapperTemplate<> BufferWrapper;
模板
类缓冲包装器模板{
.
.
.
字符缓冲区[SIZE];
};
typedef BufferWrapper模板BufferWrapper;

这样,所有现有代码都可以继续使用
BufferWrapper
,测试可以在需要时使用
BufferWrapperTemplate

也许您使用的是一个旧编译器,不支持变量的模板参数推断?您是否尝试过
BufferWrapper测试?错误提示代码与此处显示的代码不完全相同。您可以共享一个吗?问题是缓冲区大小必须在编译时知道,但我只能使用静态常量来定义大小。删除常量限定符会引发错误。缓冲区大小为
uint32\t
,而模板参数为
uint\u 32
,您可能需要相同的拼写。另外,在更改之后,您需要在c++17之前的编译器上说
BufferWrapper
(带尖括号)buffer以获得默认值。您可能会考虑像STL那样做,并将您的Buffer-Wrror定义为BasicBufferWrapper,然后使用Buffer-WrrPuls= Basic Buffer-WrrPrase<代码>;代码>因此现有代码不需要更改。那么您不需要默认值,只需在这里传递它。或者调用它
BufferWrapperImpl
,然后使用BufferWrapper=BufferWrapperImpl
提供
。这就是我要做的。嘿,是的,就像那样。我明白了,是的,我不使用C++17。谢谢你的帮助
typedef BufferWrapper BufferWrapper Template
我认为这些标识符是向后的。@eerorika谢谢,修复了。@Jarod42当然,但如果我写的东西是针对旧编译器的一种解决方法,那么最好还是使用旧语法。
template <uint_32 SIZE = BUFFER_SIZE>
class BufferWrapperTemplate;

using BufferWrapper = BufferWrapperTemplate<>;
template <uint_32 SIZE = BUFFER_SIZE>
class BufferWrapperTemplate {
.
.
.

char buffer_[SIZE];
};

typedef BufferWrapperTemplate<> BufferWrapper;