1

新しいスタイルのYamlCppAPIを使用して、いくつかのカスタム入力タイプを定義しようとしています。2つの質問があります。最初に、現在0.3 style-apiを使用しており、すべてがうまく機能していると言いましょう。新しいAPIのコードの外観は約10倍優れているので、それに移行したいと思いました。

  1. 私の現在のアプローチがコンパイラを台無しにするのはなぜですか?
  2. 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を使用して最新のソースから再コンパイルしました。これらの例はすべて、そのコードからのものです。

4

1 に答える 1

1

はい、yaml-cpp はネストされたテンプレートを処理できるはずです (したがって、std::vector<std::pair<qint16, qint16>>- の変換を定義する必要はありません。これは、yaml-cpp がstd::pair<T, U>一般的な変換を定義する必要があることを示唆しています ( http://code.google. com/p/yaml-cpp/issues/detail?id=188 ))。

そして、コンパイラがあなたのコードを受け入れない理由がわかりません (それは正しいように見え、私にとっては Linux でうまくコンパイルされます)。

テストはまったくコンパイルされますか? どうやら、0.5.0 は Visual Studio ( http://code.google.com/p/yaml-cpp/issues/detail?id=182を参照) ではそのままでは機能せず、まだ修正をテストまたはマージする機会はありません。

于 2013-01-30T17:40:05.360 に答える