【发布时间】:2012-07-17 20:57:45
【问题描述】:
我正在尝试使用 GCC 3.4.6 和 Boost 1.43 编译以下看似简单的代码,它会产生内部编译器错误:
#include <string>
#include <boost/spirit/include/lex_lexertl.hpp>
#include <boost/spirit/include/qi.hpp>
namespace lex = boost::spirit::lex;
namespace qi = boost::spirit::qi;
typedef lex::lexertl::token<std::string::iterator> TokenT;
typedef lex::lexertl::actor_lexer<TokenT> LexerT;
template <typename LexerT>
struct Tokens: public lex::lexer<LexerT>
{};
int main()
{
typedef Tokens<LexerT>::iterator_type IteratorT;
qi::rule<IteratorT, int> expression;
expression = (qi::int_ >> qi::int_) [ qi::_val = qi::_1 ];
}
生成的错误:
.../boost/mpl/aux_/preprocessed/gcc/template_arity.hpp:83: internal compiler error: in lookup_member, at cp/search.c:1300
main() 的最后一行产生了这个错误。通过让expression 规则在std::string::iterator 而不是IteratorT 上工作,此错误就会消失。
非常感谢您在使用词法分析器的同时修复错误的任何帮助。
谢谢!
【问题讨论】:
-
首先...获得更新的编译器。这是cygwin吗?使用 mingw,链接:mingw-w64.sourceforge.net(64bit 和 32bit 此处为 4.7.1)
-
当前 GCC 是 4.7.1。 3.4.6 版非常非常旧(大约 2006 年 3 月)。
-
我知道这是一个旧的编译器,但这是我工作场所的构建环境支持的最新版本,所以我别无选择!顺便说一句:我对这个问题做了一些修改。它似乎与延迟函数对象无关。是词法分析器!
-
什么编译环境只支持GCC 3.4.6?我所知道的没有实际的 build 环境。
-
我猜这与构建环境无关(在我们的案例中是内部构建的)。更多的是关于我们支持的平台(RHEL 3 和 4)以及它们上可用的默认编译器和 C 库。说到生意,你知道生活并不理想:)
标签: gcc boost-spirit boost-spirit-qi gcc3 boost-spirit-lex