web-dev-qa-db-ja.com

C ++テンプレートのコンパイルエラー:「>」トークンの前にプライマリ式が必要です

このコードはコンパイルされ、期待どおりに機能します(実行時にスローされますが、気にしないでください)。

#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が必要です。このエラーを理解して修正するのを手伝ってください。


テンプレート:クラスのテンプレートメンバー関数とうまく機能しないテンプレート関数—他の良い答えと説明を含む同様の人気のある質問を参照してください。

39
Andrew T

あなたがする必要があります:

std::cout << pt.template get<std::string>("path");

タイプの代わりにテンプレートメンバーを除いて、templateと同じ状況でtypenameを使用します。

(つまり、pt::getはテンプレートメンバーです依存テンプレートパラメータで、コンパイラにそれがテンプレートであることを伝える必要があります。)

61
GManNickG