Объявление размера буфера в классе C ++: BUFFER_SIZE не является типом - PullRequest
0 голосов
/ 20 марта 2020

Извините заранее за разлив кода ниже. Первое размещение, поэтому я хочу быть тщательным.

Я экспериментирую с существующим, работающим XML синтаксическим анализатором, написанным на C ++, путем перемещения переменных и методов из main в класс с именем XMLParser. Моя цель - немного очистить код, чтобы облегчить дальнейшее обслуживание.

После перемещения переменных и методов я получаю следующую ошибку, в частности, после перемещения объявления буфера из 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. В чем разница между доступом к BUFFER_SIZE в refillBuffer из main и из XMLParser.hpp, который вызывает ошибку в программе, как это? проблема с областью в 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
'''

Ответы [ 2 ]

1 голос
/ 20 марта 2020

Чтобы выполнить инициализацию в классе, она должна быть «инициализатором скобок или равно» (см. [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 не является типом.

0 голосов
/ 20 марта 2020

Нашел проблему. Способ, которым я объявляю буфер выше, является эквивалентом записи заголовка для функции-члена вместо объявления вектора размером BUFFER_SIZE.

Решением было объявить векторы buffer и pc следующим образом:

std::vector<char> buffer = std::vector<char>(BUFFER_SIZE);
std::vector<char>::const_iterator pc = buffer.cend();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...