【发布时间】:2018-05-10 17:00:50
【问题描述】:
首先,我使用的是 MSVC 2017(最新版本)。 这是我的非终端解析器代码:
播放器.hpp
namespace parse
{
namespace impl
{
namespace x3 = boost::spirit::x3;
struct _tag;
using player_type = x3::rule<_tag, PlayerIterator>;
using player_vector_type = x3::rule<_tag, std::vector<PlayerIterator>>;
BOOST_SPIRIT_DECLARE(player_type);
BOOST_SPIRIT_DECLARE(player_vector_type);
}; //impl
impl::player_type player();
impl::player_vector_type player_vector();
}; //parse
播放器.cpp
namespace parse
{
namespace impl
{
const player_type player = "player";
const player_vector_type player_vector = "player_vector";
auto player_find = [](auto &ctx)
{
auto &attr = x3::_attr(ctx);
if(attr.which() == 0)
return x3::_val(ctx) = PlayerManager::find(boost::get<int>(attr));
return x3::_val(ctx) = PlayerManager::find(boost::get<std::string>(attr));
};
auto player_vector_find = [](auto &ctx)
{
return x3::_val(ctx) = PlayerManager::vector_find(x3::_attr(ctx));
};
auto const player_def = (x3::int_ | (+x3::char_))[player_find];
auto const player_vector_def = (((+x3::char_)[player_vector_find]));
BOOST_SPIRIT_DEFINE(player);
BOOST_SPIRIT_DEFINE(player_vector);
BOOST_SPIRIT_INSTANTIATE(player_type, iterator_type, context_type);
BOOST_SPIRIT_INSTANTIATE(player_vector_type, iterator_type, context_type);
} //impl
parse::impl::player_type player() { return impl::player; }
parse::impl::player_vector_type player_vector() { return impl::player_vector; }
}//parse
我收到有关“引用了未解析的外部符号”的链接器 LNK2019 错误:
Pastebin.com link with the errors
关于他们的任何想法?
提前致谢。
编辑:
我在源文件中就是这样称呼它的:
void test(std::string ¶ms)
{
std::tuple<PlayerIterator, std::vector<PlayerIterator>, std::string> tuple;
if (!x3::phrase_parse(params.begin(), params.end(), parse::player()>> parse::player_vector() >> (+x3::char_), x3::space,tuple))
{
std::cout << "Error: Parsing failed" << std::endl;
return;
}
std::cout << "Parsing succeded" << std::endl;
std::cout << "Found player, size of player vector: "<< std::get<1>(tuple).size() << ", also parsed string:" << std::get<2>(tuple);
return;
};
【问题讨论】:
-
您粘贴了不相关的代码。
-
与所有未解析的外部一样,您是否将库添加到项目中,无论是在项目设置中还是作为
#pragma comment(lib, "LibraryName.lib")指令? -
@MartinVéronneau 什么图书馆? boost::spirit::x3 只是标题...
-
一个未解析的外部意味着编译器找到了一个函数的定义,但链接器没有找到它的任何实现。我从来没有用过 x3,所以我不能确切地知道发生了什么。这就是为什么我只发表评论。链接器似乎表明缺少的函数是从 boost::spirit::x3::rule() 调用的,所以它可能是一个错误的规则定义(如果我正确理解 x3 的目的)。
-
@MartinVéronneau 我知道它找不到它,这就是我发布的原因。实际上宏
BOOST_SPIRIT_DEFINE应该定义函数parse::impl::parse_rule<>()。看到它on Spirit's GitHub repo
标签: c++ boost boost-spirit boost-spirit-x3