Внутренняя ошибка компилятора Cygwin g ++ (ошибка сегментации) в EOF, с pugixml

Это минимальный код для воспроизведения проблемы. Единственным внешним условием является файл pugixml.hpp.

Контекст является классом для разрешения ссылок на идентификаторы в XML-файле (т. Е. По заданному строковому значению найдите узел, для атрибута id которого установлено это значение). У меня есть несколько вспомогательных классов, обертывающих API pugixml, из которых соответствующая часть выглядит так:

Agent.h

#include "pugixml.hpp"#include <algorithm>
#include <functional>

/**
* Adapter to strip away the xpath layer around a xml_node.
*/
template <typename Functor>
struct Shim
{
Functor&    functor_;

Shim( Functor&  functor )
: functor_(functor)
{}

void operator() ( pugi::xpath_node const& xpnode )
{
functor_( xpnode.node() );
}
};

class Agent
{
public:
explicit
Agent( std::string const& xpath )
: xpath_(xpath)
{}

// generic traverse over an xpath node_set
template <typename Handler >
size_t map( pugi::xml_node const& root, Handler& handler ) const
{
pugi::xpath_node_set    _xpset(root.select_nodes( xpath_.c_str() ));
if ( _xpset.size() > 0 )
{
std::for_each( _xpset.begin(), _xpset.end(), Shim<Handler>(handler) );
}
return _xpset.size();
}

private:
std::string     xpath_; // TODO: compile this into xpath_query?
};

#define XML_Node    pugi::xml_node

Моя первая реализация класса распознавателя id была такой

IdNodeSet-хиджра

#include "Agent.h"#include <map>

class IdNodeSet
{
typedef std::map<char const*, XML_Node> NodeMap;
public:
IdNodeSet( XML_Node const& docRoot, XML_Node& defaultNode = XML_Node() )
: map_()
, default_(defaultNode)
{
Agent("//*[@id]").map( docRoot, *this );
}

void operator() ( XML_Node const& node )
{
map_[node.attribute("id").as_string()] = node;
}

XML_Node operator [] ( const char* id ) const
{
NodeMap::const_iterator _cit(map_.find( id ));
return _cit != map_.end() ? _cit->second : default_;
}

private:
NodeMap     map_;
XML_Node    default_;
};

Это привело к следующей ошибке в Cygwin g ++ 3.4.4 (cygming special, gdc 0.12, используя dmd 0.125):

IdNodeSet-A.h:29: internal compiler error: Segmentation fault
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://cygwin.com/problems.html> for instructions.

Что совершенно загадочно.

Единственное, что приходит мне на ум, это использование «* this» в конструкторе. Но вместо этого используется модификация с использованием вспомогательного класса:

IDNodeSet-B.h

#include "Agent.h"#include <map>

class IdNodeSet
{
typedef std::map<char const*, XML_Node> NodeMap;
public:
IdNodeSet( XML_Node const& docRoot, XML_Node& defaultNode = XML_Node() )
: map_()
, helper_(map_)
, default_(defaultNode)
{
Agent("//*[@id]").map( docRoot, helper_ );
}

XML_Node operator [] ( const char* id ) const
{
NodeMap::const_iterator _cit(map_.find( id ));
return _cit != map_.end() ? _cit->second : default_;
}

private:
NodeMap     map_;
struct Helper
{
Helper(NodeMap& map)
: map_(map)
{}

void operator() ( XML_Node const& node )
{
map_[node.attribute("id").as_string()] = node;
}

NodeMap&    map_;
}           helper_;
XML_Node    default_;
};

выдает ту же ошибку:

IdNodeSet-B.h:38: internal compiler error: Segmentation fault
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://cygwin.com/problems.html> for instructions.

Это не ракетостроительный код, так что может быть причиной того, что компилятор выгрузит ядро?

ОБНОВИТЬ: Вывод препроцессора (т.е. из g ++ -E) компилируется без проблем в обоих случаях. Таким образом, это квалифицируется как возможный обходной путь, но остается вопрос: какого рода код следует избегать в ситуациях, когда обходной путь невозможен?

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]