2012-04-15 9 views
6
std::tr1::_Bind<void (*()(std::tr1::reference_wrapper<int>))(int&)> 

私はstd::tr1::reference_wrapper<int>を理解しています。この全体が、voidを返す何らかの種類の関数ポインタであり、引数としてint&をとります。しかし、最初に*()に従うことはできません。コードの一部がgdbセッションから切り取られてしまいました。このテンプレートのタイプは何ですか?

また、tr1 ::関数の型は何ですか? voidを返し引数を取らない関数もありますか?

0x00000001000021a1 in std::tr1::function<void()()>::operator() (this=0x7fff5fbffb98) at functional_iterate.h:865 

しかし、その後、次のエラーである:

template <typename T> 
void f() 
{ 
    cout << "general\n"; 
} 

template<> 
void f<void()()>() // this is error 
{ 
    cout << "specific\n"; 
} 

答えて

4

これは、関数std::tr1::reference_wrapper<int>を取り、intへの参照を取る関数へのポインタを返すの種類でインスタンスstd::tr1::_Bindのインスタンスであります空を返す。ここで

はそれを読む方法は次のとおりです。

  • std::tr1::_Bind<タイプ>は明らかです。
  • タイプ)(int&) FN = void (機能int&を取り、voidを返しています。
  • FN = *PTRそれは実際に
  • PTR = (FN2)(std::tr1::reference_wrapper<int>)を関数へのポインタはstd::tr1::reference_wrapper<int>を取る関数であり、私たちが今まで持っていたことは、その戻り値の型でいますので。
  • fn2 =(関数名(型名)には名前が与えられていないため、(空) FN2が空になったとき、私は今、気づくよう

はしかし、その周りの括弧は、おそらくまた、(そこにあなたが関数型「の機能はパラメータを取らないし、voidを返す」void()ように書くのと同じようにすべきではありません。。空の「機能名」の周りに余分な括弧を持つ関数はパラメータを取らないとvoidを返し、

OK、今それをテストした:GDBは確かにを出力しないvoid()()std::tr1::function

場合は1つが正確ということですとしてvoid()();これはおそらくgdbバグと見なされるべきです。

ため、C++での最初のタイプを記述するための正しい方法は次のとおりです。

std::tr1::_Bind<void (*(std::tr1::reference_wrapper<int>))(int&)> 
+0

スターは、そのための2つの括弧の間にあるべきではないでしょうか。 – 6502

+0

@ 6502:いいえ、星は関数の* return type *に属しています(それ自体は関数であり、*関数*は星が対応するかっこ内にあります)。 – celtschk

+0

@ Fanatic23:私はすでにそれを書いている段階にありました。ちょうど時間がかかりました。 – celtschk

関連する問題