コードの何が問題なのかわかりません。Boost のテンプレートは私を夢中にさせます! 私はこれらすべてについて頭も尻尾も作ることができないので、ただ尋ねなければなりませんでした。
これの何が問題なのですか?
#include <iostream>
#include <boost/lambda/lambda.hpp>
#include <boost/spirit/include/qi.hpp>
void parsePathTest(const std::string &path)
{
namespace lambda = boost::lambda;
using namespace boost::spirit;
const std::string permitted = "._\\-#@a-zA-Z0-9";
const std::string physicalPermitted = permitted + "/\\\\";
const std::string archivedPermitted = permitted + ":{}";
std::string physical,archived;
// avoids non-const reference to rvalue
std::string::const_iterator begin = path.begin(),end = path.end();
// splits a string like "some/nice-path/while_checking:permitted#symbols.bin"
// as physical = "some/nice-path/while_checking"
// and archived = "permitted#symbols.bin" (if this portion exists)
// I could barely find out the type for this expression
auto expr
= ( +char_(physicalPermitted) ) [lambda::var(physical) = lambda::_1]
>> -(
':'
>> (
+char_(archivedPermitted) [lambda::var(archived) = lambda::_1]
)
)
;
// the error occurs in a template instantiated from here
qi::parse(begin,end,expr);
std::cout << physical << '\n' << archived << '\n';
}
エラーの数は膨大です。これを自分でコンパイルするのを手伝いたい人をお勧めします(私を信じてください、ここに貼り付けるのは実用的ではありません)。最新の TDM-GCC バージョン (GCC 4.4.1) と Boost バージョン 1.39.00 を使用しています。
static_assert
おまけとして、C++0x の新しい機能がこの意味で Boost に役立つかどうか、上記で引用した実装が良いアイデアかどうか、または Boost の String Algorithms ライブラリを使用する必要があるかどうか、さらに 2 つのことをお聞きしたいと思います。 . 後者はおそらくはるかに優れたパフォーマンスを提供しますか?
ありがとう。
- 編集
次の非常に最小限のサンプルは、最初は上記のコードとまったく同じエラーで失敗します。
#include <iostream>
#include <boost/spirit/include/qi.hpp>
int main()
{
using namespace boost::spirit;
std::string str = "sample";
std::string::const_iterator begin(str.begin()), end(str.end());
auto expr
= ( +char_("a-zA-Z") )
;
// the error occurs in a template instantiated from here
if (qi::parse(begin,end,expr))
{
std::cout << "[+] Parsed!\n";
}
else
{
std::cout << "[-] Parsing failed.\n";
}
return 0;
}
-- 編集 2
私の古いバージョンの Boost (1.39) でなぜ動作しなかったのかはまだわかりませんが、Boost 1.42 にアップグレードすると問題が解決しました。次のコードは、Boost 1.42 で完全にコンパイルおよび実行されます。
#include <iostream>
#include <boost/spirit/include/qi.hpp>
int main()
{
using namespace boost::spirit;
std::string str = "sample";
std::string::const_iterator begin(str.begin()), end(str.end());
auto expr
= ( +qi::char_("a-zA-Z") ) // notice this line; char_ is not part of
// boost::spirit anymore (or maybe I didn't
// include the right headers, but, regardless,
// khaiser said I should use qi::char_, so here
// it goes)
;
// the error occurs in a template instantiated from here
if (qi::parse(begin,end,expr))
{
std::cout << "[+] Parsed!\n";
}
else
{
std::cout << "[-] Parsing failed.\n";
}
return 0;
}
ヒントをありがとう、hkaiser。