Ошибка: ожидался неполный идентификатор перед токеном «{» в Linux gcc

я получаю следующее сообщение об ошибке при попытке скомпилировать следующий код в Linux с помощью gcc (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5), в то время как он работает в Windows без проблем.

...
#include "DDImage/NoIop.h"
static const char* const CLASS = "RemoveChannels";

// -------------------- Header -------------------- \\ 
class RemoveChannels : public NoIop
{
public:
  //! Default constructor.
  RemoveChannels (Node* node) : NoIop(node)
  {
    this->_message = "\\w+";
    this->operation = 1;
  }
  
  //! Virtual destructor.
  virtual ~RemoveChannels () {}
  
  void _validate(bool) override;

private: 
  //! Information private for the node.
  ChannelSet channels;
  std::regex rgx;
  const char* _message;
  int operation; // 0 = remove, 1 = keep
};

void RemoveChannels::_validate(bool for_real)
{
  if (!this->_message) // Fast return if you don't have anything in there.
  {
      set_out_channels(Mask_None); // Tell Nuke we didn't touch anything.
      return;
  }
  ...
  
}

...

При компиляции приведенного выше кода я получаю следующее сообщение об ошибке в Linux с gcc (в Windows все работает нормально!).

Ошибка компилятора:

RemoveChannels.cpp:28:1: error: expected unqualified-id before ‘{’ token
 {
 ^
RemoveChannels.cpp:65:6: error: ‘RemoveChannels’ has not been declared
 void RemoveChannels::_validate(bool for_real)
      ^~~~~~~~~~~~~~
/RemoveChannels.cpp: In function ‘void _validate(bool)’:
RemoveChannels.cpp:67:8: error: invalid use of ‘this’ in non-member function
   if (!this->_message) // Fast return if you don't have anything in there.
        ^~~~
...

Если я удалю this-> из реализующей функции и просто использую _message, он компилируется и работает без проблем.

Может ли кто-нибудь объяснить мне, почему это происходит, и только в Linux, а не в Windows?

Какой командой вы пытаетесь это скомпилировать? Пожалуйста, покажите полную командную строку. Кроме того, в RemoveChannels.cpp вы включили заголовочный файл, в котором определяется RemoveChannels? Возможно, было бы лучше, если бы вы предоставили минимальный воспроизводимый пример.

Ted Lyngmo 17.05.2022 00:32
gcc это компилятор C, вы хотите g++
Goswin von Brederlow 17.05.2022 00:36

Название неправильное. Первая ошибка другая. Возможно, из-за использования подчеркивания в имени.

273K 17.05.2022 00:38

Эй, @TedLyngmo, спасибо за быстрые ответы. Я использую CMake для создания файла make для компиляции кода. Таким образом, помимо флагов CMake по умолчанию, я использую следующие дополнительные флаги: 14)

Jonas Sorgenfrei 17.05.2022 00:39

@GoswinvonBrederlow gcc обнаружит язык (по расширению файла), но не будет связывать стандартную библиотеку C++ по умолчанию, так что это не проблема.

Marek R 17.05.2022 00:40

@JonasSorgenfrei Что, если вы сделаете g++ -c path/to/RemoveChannels.cpp -I necessary/include/path, это сработает?

Ted Lyngmo 17.05.2022 00:41

@TedLyngmo, спасибо, попробую завтра, когда вернусь на свою Linux-станцию.

Jonas Sorgenfrei 17.05.2022 00:43

@ 273K Я не думаю, что проблема в подчеркивании, я получаю ту же ошибку компилятора, если переименовываю _message в message.

Jonas Sorgenfrei 17.05.2022 00:46
github.com/jonassorgenfrei/Nuke-RemoveChannels/blob/master/s‌​rc/… Кстати, вот полный код приведенного выше фрагмента.
Jonas Sorgenfrei 17.05.2022 00:47

`// -------------------- Заголовок -------------------- \` Не делать это. эта обратная косая черта имеет особое значение. Это означает игнорировать новую строку. Строка продолжается на следующую строку. Избавьтесь от него, и вам должно быть хорошо идти. Смотри, это даже искажает форматирование этого комментария.

user4581301 17.05.2022 00:52

Примечание: такие странные смурфы делают минимальный воспроизводимый пример абсолютно необходимым инструментом. Если бы вы построили MRE и удалили комментарии, то увидели бы, что проблема волшебным образом исчезла.

user4581301 17.05.2022 00:55

Решено! Комментарий заголовка вызывал ошибку. Спасибо @ user4581301 Но все же жаль, что это работало при удалении операторов this, а также в Windows без жалоб.

Jonas Sorgenfrei 17.05.2022 00:57

Какой компилятор вы использовали в Windows? Оказывается, Visual Studio выводит очень полезное предупреждение: godbolt.org/z/eEP5bT4Mc.

user4581301 17.05.2022 01:08

Как и GCC с -Wall: godbolt.org/z/s6TaMjbb6

user4581301 17.05.2022 01:09

Нашел разницу: MSVC не считает обратную косую черту, если после нее стоит пробел. GCC делает: godbolt.org/z/TMz4cda1f . Я не совсем думаю, что это кошерно со стороны GCC, но мне придется заняться стандартным дайвингом, чтобы точно узнать, что такое официальное решение, и, честно говоря, я не уверен, с чего начать поиск.

user4581301 17.05.2022 01:15
Похоже, что GCC прав.
user4581301 17.05.2022 01:19

Круто, @ user4581301, спасибо, что погрузились глубже и сообщили мне/нам причину.

Jonas Sorgenfrei 17.05.2022 02:10
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
17
49
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Простой пример

// -------------------- Header --------------------\\
class RemoveChannels
{
public:
  int operation = 0;
};

int main ()
{
    RemoveChannels r;
    r.operation++;
}

когда строка заканчивается обратной косой чертой, она продолжается на следующей строке. Это означает, что class RemoveChannels был случайно закомментирован, и комментарий к строке просочился на следующую строку.

Решение: убрать обратную косую черту

// -------------------- Header --------------------
class RemoveChannels
{
public:
  int operation = 0;
};

int main ()
{
    RemoveChannels r;
    r.operation++;
}

Я удивлен и впечатлен, увидев, что подсветка синтаксиса в SO также обнаружила эту ошибку.

user4581301 17.05.2022 01:11

Да, вы правы (позор мне), я должен был вставить весь код, прежде чем пытаться его упростить, тогда я, вероятно, увидел бы его сам. Vscode и VS Studio не давали никаких подсказок в редакторе.

Jonas Sorgenfrei 17.05.2022 02:08

Другие вопросы по теме

Похожие вопросы

Используют ли предварительно скомпилированные заголовки предварительно скомпилированные заголовки, если они включены, или они предназначены только для файлов .cpp?
Введите каламбур в константном / статическом инициализаторе (построение константы с плавающей запятой из битов)
Могу ли я добавить другую функцию, определенную в моем коде, в вектор, такой как массивы, которые включают адрес функции?
Есть ли способ «сбросить» переменные функций?
Ошибка C2679: бинарный '>>': оператор не найден
Не удается вызвать указатель функции структуры на метод класса
Как работает параметр приблизительноPolyDP и эпсилон?
Как вставить запись в Microsoft Access с помощью MFC?
Включение предварительно скомпилированного заголовка и непредварительно скомпилированного заголовка в файл .cpp приводит к тому, что файл .cpp не распознает непредварительно скомпилированный заголовок.
Привязка rvalue ref к строковому литералу в конструкторе по сравнению с построением на месте