我正在使用助推精神,爲了簡化對多個解析器組件的測試,我希望有一個像這樣的助手函數(它不起作用)助推器助手功能(帶模板返回類型的模板)
namespace qi = boost::spirit::qi;
namespace tests {
template <typename P, typename Attr>
Attr parse(P const& p, const string& input)
{
string::const_iterator f = input.begin();
string::const_iterator l = input.end();
Attr parsed;
qi::phrase_parse(f, l, p, boost::spirit::ascii::space, parsed);
return parsed;
}
}
後來到這樣稱呼它
BOOST_CHECK_EQUAL(parse(qi::int_, "23"), 23);
編譯器錯誤是這樣的
template<class P, class Attr> Attr tests::parse(const P&, const string&)
template argument deduction/substitution failed:
couldn't deduce template parameter ‘Attr’
一個解決方案是更改函數解析,以便它通過引用返回參數中的解析值。但我想知道是否還有其他方法。
也許P和Attr是相關的,我在文檔中找不到它(因爲Attr是解析器P返回的類型),因此這可能只是一種類型的模板?
我能代替離開的定義是,並更改呼叫
BOOST_CHECK_EQUAL(parse<X,Y>(qi::int_, "23"), 23);
但後來,什麼是X型?
如果有幫助,任何解析器的屬性類型可以通過'typename P :: template attribute :: type'來獲得。但在你的情況下,你可以將'parse'改成'template ',並且只需要指定'Attr',而不是'P':'BOOST_CHECK_EQUAL(解析(qi :: int_,「23」 ),23);'。 –
ildjarn