在 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_SIZErefillBuffer.hpp 中声明和初始化。当buffermain 而不是XMLParser.hpp 中声明时,解析器运行没有问题。从mainXMLParser.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 的向量。

解决方案是像这样声明bufferpc 向量:

std::vector<char> buffer = std::vector<char>(BUFFER_SIZE);
std::vector<char>::const_iterator pc = buffer.cend();

【讨论】:

以上是关于在 C++ 类中声明缓冲区大小:BUFFER_SIZE 不是类型的主要内容,如果未能解决你的问题,请参考以下文章

如何转发声明类中的对象? (C++)

是否可以在 C++ 类中声明一个虚拟静态常量值?

在具有 C++ 中另一个类型的类中声明属性 [重复]

C++ 错误在模板类中声明 std::pair

为啥我不能只用前向声明 C++ 声明一个类的静态成员?

使用 OpenAL(C++) 录制声音。缓冲区大小