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