在 C++ 类中声明缓冲区大小:BUFFER_SIZE 不是类型
Posted
技术标签:
【中文标题】在 C++ 类中声明缓冲区大小:BUFFER_SIZE 不是类型【英文标题】:Declaring a buffer size within a C++ class: BUFFER_SIZE is not a type 【发布时间】:2020-03-20 00:09:59 【问题描述】:对于下面的代码泛滥,我们深表歉意。第一次发帖,想详细点。
我通过将变量和方法从 main 移动到一个名为 XMLParser 的类来试验现有的、用 C++ 编写的可运行的 XML 解析器。我的目标是稍微清理一下代码,让以后的维护更容易一些。
在移动变量和方法之后,我在将缓冲区声明从 main
移动到 XMLParser.hpp
后特别遇到以下错误:
/[build directory]/XMLParser.hpp:37:30: error: ‘BUFFER_SIZE’ is not a type
std::vector<char> buffer(BUFFER_SIZE);
buffer
是一个 std::vector 容器,其大小由const int BUFFER_SIZE
声明。 BUFFER_SIZE
在refillBuffer.hpp
中声明和初始化。当buffer
在main
而不是XMLParser.hpp
中声明时,解析器运行没有问题。从main
和XMLParser.hpp
访问refillBuffer
中的BUFFER_SIZE
有什么区别导致程序出现这样的错误? XMLParser.hpp
中是否存在阻止其查看 BUFFER_SIZE
的范围问题?
main.cpp:
#include "refillBuffer.hpp"
#include "XMLParser.hpp"
int main()
XMLParser parser;
// std::vector<char> buffer(BUFFER_SIZE);
// auto pc = buffer.cend();
while (true)
// parse XML using methods and variables in parser
// print report here
return 0;
XMLParser.hpp
#ifndef INCLUDE_XMLPARSER_HPP
#define INCLUDE_XMLPARSER_HPP
#include "refillBuffer.hpp"
#include <vector>
#include <errno.h>
#include <stdlib.h>
#include <algorithm>
#include <cstring>
#include <iostream>
class XMLParser
public:
int textsize = 0;
int loc = 0;
int expr_count = 0;
int function_count = 0;
int class_count = 0;
int file_count = 0;
int decl_count = 0;
int comment_count = 0;
int return_count = 0;
int literal_string_count = 0;
int block_comment_count = 0;
int depth = 0;
long total = 0;
bool intag = false;
std::vector<char> buffer(BUFFER_SIZE);
auto pc = buffer.cend();
// methods using above variables go here
;
#endif
refillBuffer.hpp
#ifndef INCLUDE_REFILLBUFFER_HPP
#define INCLUDE_REFILLBUFFER_HPP
#include <vector>
#include <iterator>
const int BUFFER_SIZE = 16 * 4096;
// Refill the buffer preserving the unused data
std::vector<char>::const_iterator refillBuffer(std::vector<char>::const_iterator pc, std::vector<char>& buffer, long& total);
#endif
'''
【问题讨论】:
【参考方案1】:要进行类内初始化,它需要是“大括号或等于初始化器”(请参阅[class.mem]/10)。也就是说,
struct S
int a = 5; // OK
int b 10 ; // OK
int c = 20 ; // OK
int d(1); // Not OK
;
特别是,您收到的错误消息是因为编译器认为对于int e(X)
形式的某些东西,您声明了一个函数e
采用X
并返回一个int
,因为这不是一个有效的默认成员初始化器。但是,对于您的问题,BUFFER_SIZE
不是类型。
【讨论】:
【参考方案2】:发现问题。我在上面声明缓冲区的方式相当于为成员函数编写头文件,而不是声明大小为BUFFER_SIZE
的向量。
解决方案是像这样声明buffer
和pc
向量:
std::vector<char> buffer = std::vector<char>(BUFFER_SIZE);
std::vector<char>::const_iterator pc = buffer.cend();
【讨论】:
以上是关于在 C++ 类中声明缓冲区大小:BUFFER_SIZE 不是类型的主要内容,如果未能解决你的问题,请参考以下文章