Синтаксическая ошибка 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.

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