Ожидаемая ошибка компилятора

Я являюсь ОП для вопроса: расширение класса, в котором я получил отличный ответ. Однако, когда я пытаюсь скомпилировать код (немного переработанный для моего проекта), я получил следующее сообщение (строка изменилась, чтобы отразить следующий пример кода):

except.h: | 09 | expected nested-name-specifier before ‘handler_t1’

наряду со многими другими, которые, кажется, происходят из этой линии. Я новичок в C++, и мои исследования ответа (и предстоящей проблемы) привели к этому факту: компилятор Microsoft, кажется, принимает код, а стандарты - нет.

Код, который у меня сейчас есть, выглядит следующим образом:

#include <vector>
namespace except
{
  // several other classes and functions which compile and work already
  // (tested and verified) have been snipped out. Entire code is over
  // 1000 lines.

  class Error_Handler
  {
    public:
      using handler_t1 = bool (*)(except::Logic const&);
      std::vector<handler_t1> logic_handlers;

      // a lot more removed because the error has already happened ...
  }
}

Прочтение кода в связанном вопросе указывает мне (с моими ограниченными знаниями), что все это должно работать.

Поэтому у меня такой вопрос: что мне нужно изменить в этом объявлении / определении, чтобы это можно было компилировать с помощью gcc (4.6.3. 64-битная компиляция Linux с -std=C++0x)?

3 ответа

Решение

GCC 4.6.3 не поддерживает псевдонимы C++11: using handler_t1 = bool (*)(except::Logic const&);, Псевдонимы не шаблонных типов эквивалентны typedefs: typedef bool (*handler_t1)(except::Logic const&);, Замените их и посмотрите, поможет ли это.

Или, что еще лучше, перейдите на более новую версию компилятора. Я считаю, что постоянные респонденты, как правило, пишут на той части языка, которая скомпилирована GCC 4.8.

РЕДАКТИРОВАТЬ: Единственная другая сомнительная функция, которую я вижу в этом ответе, основана на диапазоне, для которого, я полагаю, GCC добавила поддержку в 4.6. Вы должны быть в порядке после замены псевдонимов типов на typedefs.

С g++ до версии 6 вам нужна опция --std=c++11 чтобы иметь возможность использовать using директивы.

У меня также возникла та же проблема, и она была решена простым обновлением go G++ 4.8 в моей Ubuntu.

Я предполагаю, что у вас уже есть прежняя версия gcc, проще всего было бы добавить PPA в ваши репозитории, а обновить и обновить можно без проблем, получив последнюю версию:

sudo add-apt-repository ppa: ubuntu-toolchain-r / test

sudo apt-get update

это добавит новый PPA к другим источникам.

Затем удалите альтернативу:

sudo update-альтернативы --remove-все gcc

альтернативы обновления sudo --remove-all g++

затем:

sudo apt-get установить gcc-4.8

sudo apt-get установить g++-4.8

и как альтернативные пакеты установить:

Возможности обновления sudo --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 20

Возможности обновления sudo --install / usr / bin / g ++ g ++ /usr/bin/g++-4.8 20

sudo update-альтернативы --config gcc

sudo update-альтернативы --config g++

в конце:

sudo apt-get update

sudo apt-get upgrade -y

sudo apt-get dist-upgrade

Надеюсь, это изменит --version;)

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