このコードはコンパイルされ、期待どおりに機能します(実行時にスローされますが、気にしないでください)。
#include <iostream>
#include <boost/property_tree/ptree.hpp>
void foo(boost::property_tree::ptree &pt)
{
std::cout << pt.get<std::string>("path"); // <---
}
int main()
{
boost::property_tree::ptree pt;
foo(pt);
return 0;
}
しかし、テンプレートを追加してfoo
プロトタイプをに変更するとすぐに
template<class ptree>
void foo(ptree &pt)
GCCでエラーが発生します:
test_ptree.cpp: In function ‘void foo(ptree&)’:
test_ptree.cpp:7: error: expected primary-expression before ‘>’ token
しかし、MSVC++ではエラーはありません!エラーはマークされた行<---
にあります。また、問題の行をに変更すると
--- std::cout << pt.get<std::string>("path"); // <---
+++ std::cout << pt.get("path", "default value");
エラーは消えます(問題は明示的な<std::string>
にあります)。
Boost.PropertyTree Boost> = 1.41が必要です。このエラーを理解して修正するのを手伝ってください。
テンプレート:クラスのテンプレートメンバー関数とうまく機能しないテンプレート関数—他の良い答えと説明を含む同様の人気のある質問を参照してください。
あなたがする必要があります:
std::cout << pt.template get<std::string>("path");
タイプの代わりにテンプレートメンバーを除いて、template
と同じ状況でtypename
を使用します。
(つまり、pt::get
はテンプレートメンバーです依存テンプレートパラメータで、コンパイラにそれがテンプレートであることを伝える必要があります。)