何があったか
boost.asioでネットワークIO書いてたら次のような状況が出てきた
- 配列作る
- 配列を関数に渡す
- 関数内で配列全体のサイズとる(正確にはテンプレート関数の引数のマッチングの問題なんだけど意味的にはニアリイコールってことで)
- ただし、関数の引数の方はテンプレート引数で決まる
で、関数をこんな具合に
template<typename T> void func(const T val){ socket.send(boost::asio::buffer(val), endpoint); //ここで問題発生 }
ところがどっこいこれだとコンパイル通らないじゃないですか。
エラーを読むと、valがポインタの参照として扱われている模様。ポインタじゃぁ要素数は取れないわけで、boost::asio::buffer()は要素数を調べようが無いのでにっちもさっちも行かなくなってコンパイルエラーというわけです。
いや、正確にはポインタ渡すんなら要素数も一緒に渡さないといけないってことなんですけど。
どうした
引数を
const T &val
にしただけ。こうすると、関数に配列の参照を渡す=配列をそのまま渡す、ということになるらしい。
こうすればboost::asio::buffer()さんはvalを受け取るだけで総サイズを計算できるわけです。