Синтаксическая ошибка C2143 при включении boost/option.hpp
Я застрял с ошибкой во время компиляции, которую я не могу понять. Я пытаюсь использовать boost::optional
в моем коде, и как только я включу boost/optional.hpp
Я не могу больше строить свой проект. Если я прокомментирую это включение, это сработает. У меня даже нет фактического использования boost::optional
в моем коде пока только инструкция include в заголовке класса (см. полный заголовок ниже). Ошибка компилятора C2143 syntax error: missing ',' before '<'
что происходит в другом заголовке Boost boost/utility/compare_pointees.hpp
(см. ссылку на GitHub ниже). Я также успешно использую другие вещи от Boost, как boost::filesystem::path
в том же проекте уже, поэтому не должно быть проблем с моим дистрибутивом Boost как таковым.
Вот мое окружение: Microsoft Visual Studio Professional 2015 Version 14.0.25431.01 Update 3
а также boost 1.62.0
, Я также использую стороннюю библиотеку C++ REST SDK, все остальное - стандартная библиотека C++.
Мой заголовок выглядит так. Я хочу добавить новый метод с boost::optional<size_t>
как тип возврата.
#pragma once
#include <boost/optional.hpp> // <==== ERROR
// C++ REST SDK
#define _TURN_OFF_PLATFORM_STRING
#include <cpprest/http_listener.h>
#include <cpprest/http_msg.h>
namespace SANDBOX::REST
{
class HttpGetHandler
{
public:
virtual void HandleHttpGetRequest(web::http::http_request request) = 0;
};
}
Место, где сообщается об ошибке компилятора, находится в заголовке Boost boost/utility/compare_pointees.hpp
, строка 36. Вы можете просмотреть полное содержимое этого файла на GitHub по https://github.com/boostorg/utility/blob/boost-1.62.0/include/boost/utility/compare_pointees.hpp
Вывод компилятора не показывает ничего, кроме этих сообщений:
1>D:\dev\lib\boost_1_62_0\boost/utility/compare_pointees.hpp(36): error C2143: syntax error: missing ',' before '<'
1> D:\dev\lib\boost_1_62_0\boost/utility/compare_pointees.hpp(40): note: see reference to class template instantiation 'boost::equal_pointees_t<OptionalPointee>' being compiled
1>D:\dev\lib\boost_1_62_0\boost/utility/compare_pointees.hpp(59): error C2143: syntax error: missing ',' before '<'
1> D:\dev\lib\boost_1_62_0\boost/utility/compare_pointees.hpp(63): note: see reference to class template instantiation 'boost::less_pointees_t<OptionalPointee>' being compiled
========== Build: 0 succeeded, 1 failed, 2 up-to-date, 0 skipped ==========
Это, безусловно, не проблема библиотеки Boost. Но как я могу понять, что не так с моими классами или настройками проекта?
PS Я могу воспроизвести поведение, даже если я использую эти самые примитивные заголовок и исходный файл в моем проекте:
Заголовочный файл Test.h
:
#pragma once
#include <boost/optional.hpp>
Исходный файл Test.cpp
:
#include "../include/Test.h"
3 ответа
Я мог выяснить причину из-за ценной подсказки llonesmiz. Я включил переключатель компилятора /std:c++latest
в моих настройках проекта можно использовать функцию определения вложенного пространства имен C++17. Активация этого переключателя удаляет некоторые устаревшие языковые функции, в частности std::binary_function
, который все еще используется в текущем дистрибутиве Boost (1.62.0), что приводит к ошибке компилятора. Наконец я решил убрать переключатель /std:c++latest
(и используйте обычный способ объявить мои пространства имен), и это решило проблему. Спасибо всем за помощь.
Проблема исправлена в boost 1.63.0. Больше не использует std::binary_function
который удален в C++17.
В моем случае у меня был #define новый DEBUG_NEW во включаемом файле Force (C++ -> Advanced). Я исправил это, добавив #undef new berore в добавочные # boost, а затем #define new DEBUG_NEW.