新しいスタイルのYamlCppAPIを使用して、いくつかのカスタム入力タイプを定義しようとしています。2つの質問があります。最初に、現在0.3 style-apiを使用しており、すべてがうまく機能していると言いましょう。新しいAPIのコードの外観は約10倍優れているので、それに移行したいと思いました。
- 私の現在のアプローチがコンパイラを台無しにするのはなぜですか?
- yaml-cppは、ネストされたテンプレートを処理するのに十分スマートです。たとえば、パーサーがstd ::vectorをenc/ decする方法を知っている場合、MyAwesomeTypeのカスタムハンドラーを個別に定義します。enc/ dec aを要求すると、それがわかり
std::vector<MyAwesomeType>
ますか?
私のコードは、例をコピーしてWebサイト(ここ)に貼り付け、それを変更することから始めました。私の現在の実装は、の変換を処理しようとしstd::vector<std::pair<qint16,qint16>>
ます-これはコンパイルされません。(fyi-qint16は単に__int16のクロスプラットフォームtypedefです)
#include "yaml-cpp\yaml.h"
#include <vector>
#include "qglobal.h"
namespace YAML {
// a std::pair of qint16's
template<>
struct convert<std::pair<qint16,qint16>> {
static Node encode( std::pair<qint16,qint16> const& rhs) {
Node node;
std::vector<qint16> newVec;
newVec.push_back(rhs.first);
newVec.push_back(rhs.second);
node = newVec;
return node;
}
static bool decode(Node const& node, std::pair<qint16,qint16> & rhs) {
if(!node.IsSequence() || node.size() != 2) {
return false;
}
rhs.first = node[0].as<qint16>();
rhs.second = node[1].as<qint16>();
return true;
}
};
// a vector of std::pair of qint16's
template<>
struct convert<std::vector<std::pair<qint16,qint16>>> {
static Node encode( std::vector<std::pair<qint16,qint16>> const& rhs) {
Node node;
for(auto pairIt=rhs.begin();pairIt!=rhs.end();++pairIt)
{
node.push_back( *pairIt );
}
return node;
}
static bool decode(Node const& node, std::vector<std::pair<qint16,qint16>> & rhs) {
if( !node.IsSequence() ) {
return false;
}
for(int k=0;k<node.size();++k)
{
rhs.push_back( node[k].as<std::pair<qint16,qint16>>() );
}
return true;
}
};
}
最後に、これを使って電話をかけたいと思います
std::map<std::string, std::vector<std::pair<qint16, qint16>>> m_vectorOfPairs;
if( doc["myPairs"] )
{
// key exists!
for( YAML::const_iterator it=doc["myPairs"].begin();it!=doc["myPairs"].end();++it)
{
m_vectorOfPairs[it->first.as<std::string>()] = it->second.as<std::vector<std::pair<qint16,qint16>>>();
}
}
...このように見える入力yamlに基づいています...
myPairs:
pairOne: [[4, 25], [48, 336]]
pairTwo: [[4, 25], [57, 336]]
pairThree: [[4, 25], [48, 336]]
これから出力されるコンパイラエラーは約300行なので、ここでは投稿しません。プラットフォーム:Visual Studio 2010 SP1 x64
ご協力いただきありがとうございます。
編集:
これが私が得る多くのエラーの最初のものです。つまり、新しいスタイルでノードキーを解析するのは幸せではないようです...これを引き起こしているのは他のエラーに関連している可能性があるためです。
コード
YAML::Node doc = YAML::LoadFile(buildFilenamePath(m_spectCameraShortName, relativePath).toStdString());
if( doc["numPixels"] )
....
原因
1>ANONPATH\thirdparty\yaml-cpp\include\yaml-cpp/node/detail/impl.h(146): error C2734: 'lhs' : const object must be initialized if not extern
1> ANONPATH\thirdparty\yaml-cpp\include\yaml-cpp/node/detail/impl.h(96) : see reference to function template instantiation 'bool YAML::detail::node_data::equals<const char[10]>(YAML::detail::node &,T (&),YAML::detail::shared_memory_holder)' being compiled
1> with
1> [
1> T=const char [10]
1> ]
1> ANONPATH\thirdparty\yaml-cpp\include\yaml-cpp/node/detail/node_ref.h(52) : see reference to function template instantiation 'YAML::detail::node &YAML::detail::node_data::get<const char[10]>(Key (&),YAML::detail::shared_memory_holder)' being compiled
1> with
1> [
1> Key=const char [10]
1> ]
1> ANONPATH\thirdparty\yaml-cpp\include\yaml-cpp/node/detail/node.h(103) : see reference to function template instantiation 'YAML::detail::node &YAML::detail::node_ref::get<const char[10]>(Key (&),YAML::detail::shared_memory_holder)' being compiled
1> with
1> [
1> Key=const char [10]
1> ]
1> ANONPATH\thirdparty\yaml-cpp\include\yaml-cpp/node/impl.h(333) : see reference to function template instantiation 'YAML::detail::node &YAML::detail::node::get<const char[10]>(Key (&),YAML::detail::shared_memory_holder)' being compiled
1> with
1> [
1> Key=const char [10]
1> ]
1> MYCODEFILE.cpp(75) : see reference to function template instantiation 'YAML::Node YAML::Node::operator []<const char[10]>(Key (&))' being compiled
1> with
1> [
1> Key=const char [10]
1> ]
上記のエラーで言及されている75行目は
if( doc["numPixels"] )
行デフォルトブランチのRev573を使用して最新のソースから再コンパイルしました。これらの例はすべて、そのコードからのものです。