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

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

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.

6

Другие решения

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

2

У меня также возникла та же проблема, и она была решена простым обновлением 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 update-альтернативы — удалить все 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;)

1
По вопросам рекламы [email protected]