Ожидаемая ошибка компилятора
Я являюсь ОП для вопроса: расширение класса, в котором я получил отличный ответ. Однако, когда я пытаюсь скомпилировать код (немного переработанный для моего проекта), я получил следующее сообщение (строка изменилась, чтобы отразить следующий пример кода):
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;)