Ошибка компиляции boost::property_tree (ошибка C2061: синтаксическая ошибка: идентификатор 'p')

Я пытаюсь скомпилировать некоторый код, который использует дерево свойств boost. Я использую Visual Studio 2010.

Если я максимально упросту код, чтобы воспроизвести ошибку, код будет выглядеть следующим образом...

#include "AppleiTunesLibraryImporter.h"
#include <boost/property_tree/xml_parser.hpp>
#include <boost/property_tree/ptree.hpp>
using namespace boost::property_tree;

AppleiTunesLibraryImporter::AppleiTunesLibraryImporter(){}
AppleiTunesLibraryImporter::~AppleiTunesLibraryImporter(){}

bool AppleiTunesLibraryImporter::ImportData( std::string itunes_library_xml_path )
{
    ptree pt;
    xml_parser::read_xml( itunes_library_xml_path.c_str(), pt, xml_parser::no_comments | xml_parser::trim_whitespace);
    return true;
}

... и полная ошибка выглядит следующим образом...

1>  AppleiTunesLibraryImporter.cpp
1>c:\<path to my file>\thirdparty\boost\boost-1.47.0\boost/detail/allocator_utilities.hpp(178): error C2061: syntax error : identifier 'p'
1>          c:\<path to my file>\thirdparty\boost\boost-1.47.0\boost/multi_index/detail/index_base.hpp(88) : see reference to function template instantiation 'void boost::detail::allocator::construct<T>(void *,const Type &)' being compiled
1>          with
1>          [
1>              T=std::pair<const std::string,boost::property_tree::basic_ptree<std::string,std::string>>,
1>              Type=std::pair<const std::string,boost::property_tree::basic_ptree<std::string,std::string>>
1>          ]
1>          c:\<path to my file>\thirdparty\boost\boost-1.47.0\boost/multi_index/detail/index_base.hpp(87) : while compiling class template member function 'boost::multi_index::detail::index_node_base<Value,Allocator> *boost::multi_index::detail::index_base<Value,IndexSpecifierList,Allocator>::insert_(const std::pair<_Ty1,_Ty2> &,boost::multi_index::detail::index_node_base<Value,Allocator> *)'
1>          with
1>          [
1>              Value=std::pair<const std::string,boost::property_tree::basic_ptree<std::string,std::string>>,
1>              Allocator=std::allocator<std::pair<const std::string,boost::property_tree::basic_ptree<std::string,std::string>>>,
1>              IndexSpecifierList=boost::multi_index::indexed_by<boost::multi_index::sequenced<>,boost::multi_index::ordered_non_unique<boost::multi_index::tag<boost::property_tree::basic_ptree<std::string,std::string>::subs::by_name>,boost::multi_index::member_offset<std::pair<const std::string,boost::property_tree::basic_ptree<std::string,std::string>>,const std::basic_string<char,std::char_traits<char>,std::allocator<char>>,0>,std::less<std::string>>>,
1>              _Ty1=const std::string,
1>              _Ty2=boost::property_tree::basic_ptree<std::string,std::string>
1>          ]
1>          c:\<path to my file>\thirdparty\boost\boost-1.47.0\boost/multi_index/ordered_index.hpp(119) : see reference to class template instantiation 'boost::multi_index::detail::index_base<Value,IndexSpecifierList,Allocator>' being compiled
1>          with
1>          [
1>              Value=std::pair<const std::string,boost::property_tree::basic_ptree<std::string,std::string>>,
1>              IndexSpecifierList=boost::multi_index::indexed_by<boost::multi_index::sequenced<>,boost::multi_index::ordered_non_unique<boost::multi_index::tag<boost::property_tree::basic_ptree<std::string,std::string>::subs::by_name>,boost::multi_index::member_offset<std::pair<const std::string,boost::property_tree::basic_ptree<std::string,std::string>>,const std::basic_string<char,std::char_traits<char>,std::allocator<char>>,0>,std::less<std::string>>>,
1>              Allocator=std::allocator<std::pair<const std::string,boost::property_tree::basic_ptree<std::string,std::string>>>
1>          ]
1>          c:\<path to my file>\thirdparty\boost\boost-1.47.0\boost/multi_index/sequenced_index.hpp(77) : see reference to class template instantiation 'boost::multi_index::detail::ordered_index<KeyFromValue,Compare,SuperMeta,TagList,Category>' being compiled
1>          with
1>          [
1>              KeyFromValue=boost::multi_index::member_offset<std::pair<const std::string,boost::property_tree::basic_ptree<std::string,std::string>>,const std::basic_string<char,std::char_traits<char>,std::allocator<char>>,0>,
1>              Compare=std::less<std::string>,
1>              SuperMeta=boost::multi_index::detail::nth_layer<2,std::pair<const std::string,boost::property_tree::basic_ptree<std::string,std::string>>,boost::multi_index::indexed_by<boost::multi_index::sequenced<>,boost::multi_index::ordered_non_unique<boost::multi_index::tag<boost::property_tree::basic_ptree<std::string,std::string>::subs::by_name>,boost::multi_index::member_offset<std::pair<const std::string,boost::property_tree::basic_ptree<std::string,std::string>>,const std::basic_string<char,std::char_traits<char>,std::allocator<char>>,0>,std::less<std::string>>>,std::allocator<std::pair<const std::string,boost::property_tree::basic_ptree<std::string,std::string>>>>,
1>              TagList=boost::mpl::vector1<boost::property_tree::basic_ptree<std::string,std::string>::subs::by_name>,
1>              Category=boost::multi_index::detail::ordered_non_unique_tag
1>          ]
1>          c:\<path to my file>\thirdparty\boost\boost-1.47.0\boost/multi_index_container.hpp(89) : see reference to class template instantiation 'boost::multi_index::detail::sequenced_index<SuperMeta,TagList>' being compiled
1>          with
1>          [
1>              SuperMeta=boost::multi_index::detail::nth_layer<1,std::pair<const std::string,boost::property_tree::basic_ptree<std::string,std::string>>,boost::multi_index::indexed_by<boost::multi_index::sequenced<>,boost::multi_index::ordered_non_unique<boost::multi_index::tag<boost::property_tree::basic_ptree<std::string,std::string>::subs::by_name>,boost::multi_index::member_offset<std::pair<const std::string,boost::property_tree::basic_ptree<std::string,std::string>>,const std::basic_string<char,std::char_traits<char>,std::allocator<char>>,0>,std::less<std::string>>>,std::allocator<std::pair<const std::string,boost::property_tree::basic_ptree<std::string,std::string>>>>,
1>              TagList=boost::mpl::vector0<boost::mpl::na>
1>          ]
1>          c:\<path to my file>\thirdparty\boost\boost-1.47.0\boost/property_tree/detail/ptree_implementation.hpp(59) : see reference to class template instantiation 'boost::multi_index::multi_index_container<Value,IndexSpecifierList>' being compiled
1>          with
1>          [
1>              Value=std::pair<const std::string,boost::property_tree::basic_ptree<std::string,std::string>>,
1>              IndexSpecifierList=boost::multi_index::indexed_by<boost::multi_index::sequenced<>,boost::multi_index::ordered_non_unique<boost::multi_index::tag<boost::property_tree::basic_ptree<std::string,std::string>::subs::by_name>,boost::multi_index::member_offset<std::pair<const std::string,boost::property_tree::basic_ptree<std::string,std::string>>,const std::basic_string<char,std::char_traits<char>,std::allocator<char>>,0>,std::less<std::string>>>
1>          ]
1>          c:\<path to my file>\thirdparty\boost\boost-1.47.0\boost/property_tree/detail/ptree_implementation.hpp(182) : see reference to class template instantiation 'boost::property_tree::basic_ptree<Key,Data>::subs' being compiled
1>          with
1>          [
1>              Key=std::string,
1>              Data=std::string
1>          ]
1>          c:\<path to my file>\thirdparty\boost\boost-1.47.0\boost/property_tree/detail/ptree_implementation.hpp(182) : while compiling class template member function 'boost::property_tree::basic_ptree<Key,Data>::basic_ptree(void)'
1>          with
1>          [
1>              Key=std::string,
1>              Data=std::string
1>          ]
1>          ..\..\..\common\Source\AppleiTunesImporter\AppleiTunesLibraryImporter.cpp(24) : see reference to class template instantiation 'boost::property_tree::basic_ptree<Key,Data>' being compiled
1>          with
1>          [
1>              Key=std::string,
1>              Data=std::string
1>          ]

Для меня строка 24 моего файла ApplieiTunesLibraryImporter.cpp просто

ptree pt;

так что компилятору не нравится мое использование. Я могу получить аналогичные ошибки, когда я использую что-то вроде

ptree::const_assoc_iterator assoc_iter;

но приведенный выше код является самым простым, что я могу сделать ошибку.

Код внутри файла наддува (allocator_utilities.hpp), который вызывает ошибку компиляции, выглядит следующим образом, но для меня это довольно загадочно.

/* allocator-independent versions of construct and destroy */

template<typename Type>
void construct(void* p,const Type& t)
{
  new (p) Type(t);
}

В случае, если кто-то хочет попробовать и воспроизвести, вот код.h.

class AppleiTunesLibraryImporter
{
public:

    AppleiTunesLibraryImporter();
    virtual ~AppleiTunesLibraryImporter();

    bool ImportData( std::string itunes_library_xml_path );

};

Все это немного растаяло, поэтому, если кто-то сможет пролить свет на это, это будет с благодарностью.

Приветствия.

1 ответ

Решение

Я нашел проблему. Проект, над которым я работаю, использует предварительно скомпилированные заголовки, и для файлов.cpp, которые используют boost libs, я должен был предотвратить это. Другими словами, я должен был щелкнуть правой кнопкой мыши на файле.cpp и перейти...

Свойства> Свойства конфигурации> C/C++ > Скомпилированные заголовки

и установите "Предварительно скомпилированные заголовки" на "Не использовать предварительно скомпилированные заголовки". Также перейдите к...

Свойства> Свойства конфигурации> C/C++ > Дополнительно

и установите "Принудительное включение файла" в ничто.

У меня была аналогичная проблема, и поскольку решение, приведенное выше, мне не подходит. Мне нужно было найти первопричину. Когда я обнаружил это, к своему раздражению, я понял, что это не первый раз, когда я провожу это расследование:). Так что на этот раз без ошибки и документируем основную причину здесь:). Я подозреваю, что это та же основная причина, что и у автора. Итак, в моем случае проблема заключалась в том, что где-то в заголовках, которые включены как часть предварительно скомпилированного, было

#define new .... // Debugging memory leaks in debug

Это определение, проходящее через предварительно скомпилированные заголовки, мешает размещению new.

Поскольку отбросить это определение проблематично ("политические" причины). Лучший способ найти в моем случае

#pragma push_macro("new")
#undef new
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/info_parser.hpp>
#pragma pop_macro("new")
Другие вопросы по тегам