0

std::map<int, FB::JSAPIWeakPtr> apiMap;コードを使用してa のすべての要素を出力しようとしました:

void printMap() {
std::map<int, FB::JSAPIWeakPtr>::iterator p; 
p= apiMap.begin();

for(; p!=apiMap.end(); ++p)
    {
    std::cout << "int is: " << p->first << endl;
    std::cout << "FB::JSAPIWeakPtr is: " << p->second << endl;
    }
}

しかし、私は以下のエラーを受け取ります:

In function ‘void printMap()’:
error: no match for ‘operator<<’ in ‘std::operator<< [with _Traits = std::char_traits<char>]((* & std::cout), 
((const char*)"map is: ")) << p.std::_Rb_tree_iterator<_Tp>::operator-> [with _Tp = std::pair<const int, 
boost::weak_ptr<FB::JSAPI> >, std::_Rb_tree_iterator<_Tp>::pointer = std::pair<const int, 
boost::weak_ptr<FB::JSAPI> >*]()->std::pair<const int, boost::weak_ptr<FB::JSAPI> >::second’

の値を出力する方法はありFB::JSAPIWeakPtrますか?

4

1 に答える 1

0

最初に認識すべきことは、FB::JSAPIWeakPtr は boost::weak_ptr の単なる typedef であることです。

実際に何を達成しようとしているのかによって異なります。まだ値があるかどうかを調べようとしているだけなら、次のようにします。

for(; p!=apiMap.end(); ++p)
{
    std::cout << "int is: " << p->first << endl;
    FB::JSAPIPtr cur(p->second.lock());
    if (cur) { std::cout << "FB::JSAPIWeakPtr is valid" << endl; }
    else { "FB::JSAPIWeakPtr is invalid" << endl; }
}

実際に値を出力したい場合は、 を使用cur.get()して実際のポインター値を取得できます。覚えておくべき主なことは、weak_ptr には実際の有効性はなく、ロックに成功した場合にのみ値を持つ (アクセス中に解放されないようにする) ことです。

注意すべきもう 1 つの点は、プラグイン開発において std::cout への書き込みが便利になることは非常にまれであることです。FireBreath Loggingを読みたいと思うかもしれません

于 2014-10-08T17:57:53.520 に答える