以下にリストされているコードを書きました。コンパイラは、「3 つのオーバーロードのいずれも、すべての引数の型を変換できませんでした」というエラーを報告します。
MSVC 11.0 と Boost 1.51.0 を使用しています。for 式の各ブランチはm_oQueryIterationExpression
正しく機能しますが、一緒にすると機能しません。手がかりはありますか?
#include <boost/spirit/include/qi.hpp>
#include <boost/tuple/tuple.hpp>
#include <boost/variant/recursive_variant.hpp>
namespace Ns
{
struct Regexp { std::string m_strEntity; };
struct String { std::string m_strEntity; };
struct Identifier { std::string m_strEntity; };
typedef int Number;
typedef std::string Operation;
typedef boost::variant<Regexp, Number, String, Identifier> Operand;
typedef boost::tuple<Operation, boost::optional<std::vector<Operand> > > OperationWithOperands;
struct QueryConcatenation;
typedef boost::tuple<boost::recursive_wrapper<QueryConcatenation>, boost::optional<char> > typeA;
typedef std::vector<std::vector<OperationWithOperands> > typeB;
typedef boost::variant<typeA, typeB> QueryIteration;
struct QueryConcatenation {
typedef std::vector<QueryIteration> TEntity;
TEntity m_oEntity;
};
}
int main()
{
using namespace Ns;
namespace qi = boost::spirit::qi;
qi::rule<char*, QueryConcatenation()> m_oQueryConcatenationExpression;
qi::rule<char*, QueryIteration()> m_oQueryIterationExpression;
qi::rule<char*, std::vector<std::vector<OperationWithOperands> >() > m_oQueryNode;
m_oQueryIterationExpression %=
qi::attr_cast<typeA, typeA>( '(' >> m_oQueryConcatenationExpression >> ')' >> -(qi::char_("*+?")) )
| m_oQueryNode;
}