トップページ⇒tech
1001コメント388KB

【C++】template 統合スレ -- STL/Boost/Loki, etc.

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
C++ のジェネリックプログラミングの話をしましょう。
以下のスレッドを統合するスレです。

STLスレッド
Part1 http://pc.2ch.net/tech/kako/1004/10042/1004287394.html
Part2 http://pc3.2ch.net/test/read.cgi/tech/1026793823/

【C++】Boost使い集まれ!
http://pc3.2ch.net/test/read.cgi/tech/1033830935/

Generic Programming with C++ Template
http://pc.2ch.net/tech/kako/1008/10085/1008593126.html

関連スレ、その他リンクは >>2-5 あたりに。
0492デフォルトの名無しさんNGNG
いや、最近のニュー速は本当に良くなってきたと思うよ。
ニュース速報板だからね。
0493デフォルトの名無しさんNGNG
・・・横槍。

削除依頼を内容証明以外の方法で行っても有効ですが、条理が根拠ではありません。
意思表示の一般原則であり自明のことです。
免責の対象にはならないから安心してください。
0494デフォルトの名無しさんNGNG
>>491
smart_ptr p;
int x = p + 1;
こんなクソコード書く奴にコンパイルエラーを叩きつけるため。
0495491NGNG
うーん。
http://lists.boost.org/MailArchives/boost/msg38117.php
あたりでやりとりされてるけど、ようわからん。
それによると・・・
・operator bool()ではintへの暗黙の型変換をするからダメ。->なんで?
・private:operator int()してもダメ。->なんで?

0496デフォルトの名無しさんNGNG
gannbattekudasai
0497491NGNG
>>494 おっと、入れ違い。
そうか、intになってしまったら*+-/なんかの演算子が許されるのか・・・
0498デフォルトの名無しさんNGNG
今改めてそのスレッド追うの面倒なので記憶に頼って書くけど、
> ・private:operator int()してもダメ。->なんで?
これは結構いいんでない?という結論になったのでなかったか。
 smart_ptr p;
 cout << p << endl;
がコンパイル通ってbool値を表示してしまうという問題はあるけれど。
0499デフォルトの名無しさんNGNG
こんな簡単なコードが通りません。

std::basic_string<unsigned char> str;
const unsigned char* p = (const unsigned char*)"abc";
str = p; //もしくはstr.assign(p);

どおして通らないのかどなたかわかりません?
0500デフォルトの名無しさんNGNG
unsignedは何か意味があるの?
0501デフォルトの名無しさんNGNG
>>500
>>487>>490のリストをgccでコンパイルするとエラーになるので、エラーが再現
する最小のプログラムを探していったら>>499になりました。

単にstd::basic_stringをunsigned charで型特定しただけなのになぜエラーが
出るんでしょうね?
0502デフォルトの名無しさんNGNG
bits/basic_string.h見てもよく分からんね。
なにか基本的なことがわかってないっぽい<自分
0503デフォルトの名無しさんNGNG
だから、どんなエラーがでるんだよ。
0504デフォルトの名無しさんNGNG
>>504
リンクエラー
0505デフォルトの名無しさんNGNG
ホゥ、世の中には、「リンクエラー」以上の情報を
報告しようとしない変態リンカが存在するのか、、、
デバッグもさぞ大変な事だな、、
0506デフォルトの名無しさんNGNG
undefined reference to `std::char_traits<unsigned char>::length(unsigned char const*)'
undefined reference to `std::char_traits<unsigned char>::copy(unsigned char*, unsigned char const*, unsigned)'
undefined reference to `std::char_traits<unsigned char>::move(unsigned char*, unsigned char const*, unsigned)'
undefined reference to `std::char_traits<unsigned char>::copy(unsigned char*, unsigned char const*, unsigned)'
undefined reference to `std::char_traits<unsigned char>::copy(unsigned char*, unsigned char const*, unsigned)'
undefined reference to `std::char_traits<unsigned char>::move(unsigned char*, unsigned char const*, unsigned)'
undefined reference to `std::char_traits<unsigned char>::copy(unsigned char*, unsigned char const*, unsigned)'
です
0507デフォルトの名無しさんNGNG
$ g++ -v
gcc version 2.95.2 19991024 (release)
では、ちゃんとコンパイル・リンクできたが。
0508デフォルトの名無しさんNGNG
>>506
書いてあるとおりだと思うが。std::char_traits<>::xxx() ってテンプレート
関数を unsigned char で特殊化したものを用意しろ、ってことだろ。
0509デフォルトの名無しさんNGNG
これってgcc3.xのbits/char_traits.hバグ?
それともSTLの仕様?
バグならバグレポート書きたいのだけど。
0510デフォルトの名無しさんNGNG
> バグならバグレポート書きたいのだけど。
そのレベルの人間は、規格書をチェックでしょう。
0511デフォルトの名無しさんNGNG
http://www.cuj.com/experts/1911/reeves.htm?topic=experts
ここを見る限りじゃどうもバグじゃないっぽい。
bits/char_traits.hの中を見れば<char>と<wchar_t>しか処理が書かれて
なくて、それ以外の型を処理の書かれてないデフォルトで
拾うようになっている。ということはunsigned char、signed charは
使うなっていう暗黙のメッセージなのかな、これは?

http://www.bohyoh.com/CandCPP/FAQ/FAQ00001.html
ただここに書かれているように"char"の符号の有無は処理系依存なんだよねえ。
この辺はどうするつもりなんだろう。gcc以外のコンパイラなど使うなっていう意味かな??w
0512デフォルトの名無しさんNGNG
>>508-511
499です。
charとwcahr_tで型特定されているのは、多分効率を重視するためでしょうね。
その反面、basic_stringで独自の型を用意しようとすると、assign()などのメンバ
を自分で用意してやらないといけなくなったと。

これで、悩まずに済むようになりました。ありがとうございました。
0513デフォルトの名無しさんNGNG
Borland-C++5.6.2では、basic_stringにunsigned charを指定してもエラー
にはなりません。それは、多分型特定してないからですね。
Include\stl\string.hを見てもそれらしい型特定はありません。

Borland-C++5.6.2はSTLportなので、確実な事は言えませんがgccでも
STLportを導入すればunsigned charの問題は回避できるような気がします。
0514山崎渉NGNG
(^^)
0515デフォルトの名無しさんNGNG
こんなアホサイトに人生振り回される奴もどうかしてるがな
0516質問NGNG
こういうのって loki にはないですか?

template<int v> struct Int2Type{
public: enum { Value = v };
};

template<typename T1, typename T2, bool isT1GreaterThanT2> struct SizeCompareRaw {
typedef int Greater;
typedef int Lesser;
};

template<typename T1, typename T2> struct SizeCompareRaw<T1, T2, true> {
typedef T1 Greater;
typedef T2 Lesser;
};
template<typename T1, typename T2> struct SizeCompareRaw<T1, T2, false> {
typedef T2 Greater;
typedef T1 Lesser;
};

template<typename T1, typename T2> struct SizeCompare{
typedef SizeCompareRaw<T1, T2, Int2Type<(sizeof(T1) > sizeof(T2))>::Value >::Greater Greater;
typedef SizeCompareRaw<T1, T2, Int2Type<(sizeof(T1) > sizeof(T2))>::Value >::Lesser Lesser;
};

typedef SizeCompare<SizeCompare<int, char>::Greater, long long>::Greater GreatestType;

もしあったら、もっと単純できれいな実装でしょうか?
0517デフォルトの名無しさんNGNG
>>516
何がしたいのか、日本語で書いてみないか?
0518デフォルトの名無しさんNGNG
>>516
> loki にはないですか?
Loki は小さいから自分で調べてみるとよろし。
少なくとも俺の記憶では、そのものズバリは無いんじゃないかと…

> もっと単純
Int2Type 使わなくともいいと思う。
あと、1番上の SizeCompareRaw の定義はいらない。

Loki::Select を再利用するとか…
template<class T, class U> Large {
  typedef Select<sizeof(T) > sizeof(U), T, U>::Result Result;
};
0519山崎渉NGNG
(^^)
0520デフォルトの名無しさんNGNG
式templateとかで静的な値を得るのに
特別な技法を使うんじゃなく、
構文が使えたら便利だよね。
(回りくどい表現になりがちだから。)
0521516NGNG
みなさんレスありがとうございます。
>>517
サイズの大きい方の型を得たかったのです。

>>518
上のソースが、Modern C++ を読んでから自分ではじめて考えた
generative 風のコードなので
(モダ++に)解説されている範囲外は、ソース見ても、まださっぱりなんですよ^^;
(見ても求めているものかどうかよくわからないんです、試せばいいのですが…^^; 本格的に g++ に乗り換えかな…)
これから少しずつ精進していこうと思います。
Int2Type を使わないで書くとどういう感じなのでしょう?
さっぱり思い当たらないのですが、ヒントだけでもいただけないでしょうか?

>>520
host-policy とかも、文法レベルでサポートしてほしいですよね。
loki を見てると、ライブラリでやる範疇をそろそろ超えているような気が…
(いい意味で捕らえると C++ の(これまでの)限界を打ち破る力だと思うのですが…)
0522デフォルトの名無しさんNGNG
>>521
Lokiが使えるなら、ヒントどころか答えが>>518に書いてあると思うんだが。
0523デフォルトの名無しさんNGNG
教えてください。

tupleのvectorをtupleの第1要素でソートしたいときどうしたらいいんでしょう。

typedef boost::tuple<int, double> Tuple;

std::vector<Tuple> data;
// data.push_back(boost::make_tuple(1, 1.0)); ....

std::sort(data.begin(), data.end(),
boost::bind(
std::less<int>(),
boost::bind(boost::mem_fn(&Tuple::get<0>, _1),
boost::bind(boost::mem_fn(&Tuple::get<0>, _2)
));

これだとコンパイル通りませんでした。
(BCB6で「コンパイラ内部のエラー」)

なんか間違ってるでしょうか。
それか、こういう場合もっと簡単な方法があるんでしょうか?
0524デフォルトの名無しさんNGNG
何気に難しいな、どうやるんだろ
0525デフォルトの名無しさんNGNG
力ずくで良いなら

struct CompByTuple1st
{
  bool operator()(const Tuple& t1, const Tuple& t2)
  {
    return t1.get_head() < t2.get_head();
  }
};

を比較用の関数オブジェクトとして sort に渡す、かねぇ。汎用性ゼロ
だが。
0526デフォルトの名無しさんNGNG
>>523
それであってる (gccなら通る) 。…が、その場合 mem_fn はなくてもOK。
BCBでまともに boost::bind を動かすのはあきらめた方が無難ではないかと。
0527デフォルトの名無しさんNGNG
皆さんありがとうございました。BCBでbind系が使えるようになる日を待ちます。
とりあえず、比較オブジェクトをtemplateにして

template <typename T, int I>
struct CompareByNth
{
bool operator()(const T & a, const T & b) const
{
return a.get<I>() < b.get<I>();
}
};

で逃げることにしました。これにstd::lessを簡単に渡せればいいんですけど…
0528デフォルトの名無しさんNGNG
>>526
gccで通った?俺はg++3.2.1で試してみたが、
C:/MinGW/Learn/boost/tuple.cpp:18: no matching function for call to `mem_fn(
<unknown type>, boost::arg<1>&)'

C:/MinGW/Learn/boost/tuple.cpp:19: no matching function for call to `mem_fn(
<unknown type>, boost::arg<2>&)'
C:/MinGW/Learn/boost/tuple.cpp:21: parse error before `;' token
なんてエラーが出やがる。
0529デフォルトの名無しさんNGNG
g++も駄目か
0530デフォルトの名無しさんNGNG
>>528>>529
boost::mem_fnを取ったらg++で通ったよ。
0531526NGNG
>>528
あーほんとだ。523のをコピペじゃなくて書き写したんで、微妙に
違うコードをコンパイルしてたわ。
sort( data.begin(), data.end(),
 bind( less<int>(),
  bind( mem_fn(&Tuple::get<0>), _1),
  bind( mem_fn(&Tuple::get<0>), _2) ));
//mem_fnは無くてOK。
0532デフォルトの名無しさんNGNG
std::accumulateを使ってプログラムを書いてみたのですが、何かこうもっと
スマートに書けないものでしょうか?

struct A {
virtual int func() {
return 1;
}
};

struct B : public A {
int func() {
return 2;
}
};

int AddA(int i, A* a)
{
return i + a->func();
}
0533デフォルトの名無しさんNGNG
int main()
{
std::vector<A*> a;
const int maxi = 100000;

for (int i = 0; i < maxi; i++)
if (std::rand() % 2)
a.push_back(new A);
else
a.push_back(new B);

int i;
std::accumulate(a.begin(), a.end(), 0, AddA);
std::cout << i << std::endl;
}
0534デフォルトの名無しさんNGNG
>>533
back_inserter と generator 使うと、もっとうまく書けそうな予感。
0535デフォルトの名無しさんNGNG
うーんこれでもまだ不格好だ・・・・

struct Add {
int value;
Add(int i) : value(i) {}
void operator()(A* a) {
value += a->func();
}
};

int main()
{
std::vector<A*> a;
const int maxi = 100000;

for (int i = 0; i < maxi; i++)
if (std::rand() % 2)
a.push_back(new A);
else
a.push_back(new B);

int i;
i = std::for_each(a.begin(), a.end(), Add(0)).value;
std::cout << i << std::endl;
}
0536デフォルトの名無しさんNGNG
>>534
back_inserterを使うという事は、他のvectorに値を入れるという事でしょうか?
0537デフォルトの名無しさんNGNG
できました。もう一個vectorを使ってやってみました。こんな感じでしょうか?

int main()
{
std::vector<A*> a;
std::vector<int> b;
const int maxi = 100000;

for (int i = 0; i < maxi; i++)
if (std::rand() % 2)
a.push_back(new A);
else
a.push_back(new B);

std::transform(a.begin(), a.end(), std::back_inserter(b), std::mem_fun(&A::func));

int i;
i = std::accumulate(b.begin(), b.end(), 0);
std::cout << i << std::endl;
}
0538デフォルトの名無しさんNGNG
さらにアルゴリズムを使ってみました。私にはこの辺が限界です。

inline A* gen()
{
return (std::rand() % 2) ? new A : new B;
}

int main()
{
std::vector<A*> a;
std::vector<int> b;
const int maxi = 100000;

std:generate_n(std::back_inserter(a), maxi, gen);
std::transform(a.begin(), a.end(), std::back_inserter(b), std::mem_fun(&A::func));

int i;
i = std::accumulate(b.begin(), b.end(), 0);
std::cout << i << std::endl;
}
0539デフォルトの名無しさんNGNG
もう一個vectorなんて、許さん。

#include <boost/iterator_adaptors.hpp>
int accumulate( const std::vector< A* >& v )
{
    std::mem_fun_t< int , A > func( &A::func );
    return std::accumulate(   boost::make_transform_iterator( v.begin() , func )
                            , boost::make_transform_iterator( v.end() , func )
                            , 0 );
}
0540デフォルトの名無しさんNGNG
gcc2.95を使ってるんだけど、ちょっと複雑なテンプレートで
すぐにInternal compiler errorを吐きやがります。
VC6は食います。

そんなもんですかね。
0541デフォルトの名無しさんNGNG
>>539
すげー!こんなコードが書けるのか。
やっぱりSTLやboostは奥が深いですねえ。
0542デフォルトの名無しさんNGNG
>>540
VCも使ってるって事は、gccはcygwinかMinGW?
0543デフォルトの名無しさんNGNG
>>542
YES YES YES
gcc3,VC7ではもちろんとおります
0544デフォルトの名無しさんNGNG
>>543
gcc2.95.2にこだわる理由は何?
もしかして仕事で使っているとか?
0545デフォルトの名無しさんNGNG
>>538
std::vector<A*> a を generate_n で作るまでは OK として、その後は

  std::accumulate(v.begin(), v.end(), 0,
        boost::compose_f_gx_hy(
          std::plus<int>(),
          std::identity<int>(),
          std::mem_fun(&A::func)
        ));

ってな感じでどう?
0546545NGNG
>>539
うまいな。そっちの方が見やすいかもしれん。

>>540
template 使いたいなら gcc 3 系列に移行しましょう。

…俺も仕事でいまだに gcc 2.96 使ってるけど、早く捨てたい。
0547543NGNG
趣味だったらVC7/GCC3にするって。
仕事なんでVC6/GCC2.95を使わざるをえません。

あれからいろいろいじったけど、
どうやってもgcc2.95で通らないんだな。

vc6は、使うものしか処理しないって感じだねえ。
gcc2.95は、使おうが使うまいが、ある程度処理するみたい。
落ちてるところは実際には使われない部分だったりするからナントモ。
0548デフォルトの名無しさんNGNG
>>545
std::identityってのは初めて見ました。ここの文脈ではint()とは書けないから
必要なんですね。標準C++には無いようですが、STLportには幸いにも装備
されていました。
0549デフォルトの名無しさんNGNG
ところでg++3.2.1でstd::identityがエラーが出るのですが、boostには
これの代用になる物がありますか?
0550デフォルトの名無しさんNGNG
>>549
簡単なものだから、自分で書いちゃっても。
これは要するに

 f(x) = x

となるような恒等変換をする関数オブジェクト。

namespace std {
  template <typename T>
  struct identity : public unary_function<T, T>
  {
    T& operator()(T& x) const { return x; }
    const T& operator()(const T& x) const { return x; }
  };
}
0551デフォルトの名無しさんNGNG
>>550
なるほど、関数オブジェクト化すればよかったのですね。
ありがとうございます。
0552デフォルトの名無しさんNGNG
template<bool Val>
struct A{
   template<class T> struct B{};
};
template<class T1,class T2>
struct C{
   typedef A<sizeof(T1)==sizeof(T2)>::B<T1> type;
};
main(){
   A<sizeof(int)==sizeof(int)>::B<int> val1; // ここはエラーにならない
   C<int,int>::type val2; // ここでエラー
}
これって文法的にはどうなんでしょうか?

VC7とDigital Mars C++では通るのですが、
去年の夏ごろのmingwではコンパイラ内部エラーになり、
冬に出たmingwでは内部エラーにはならないもののコンパイルできないのです。
0553デフォルトの名無しさんNGNG
vectorクラスにpush_backしたらポインタがふっとんでがびーん
0554543NGNG
ようやく最小限のコードになったよ・・・

-----
// gcc2.95(cygwin)でinternal compiler error

template<typename T>
struct A {
  T* pT;
};

//template<typename V>
struct B {
  template<typename T>
  struct C : public A<T> {
    void func(T* pT) {
      return;
    }
  };
};
-----

中央のコメントアウトしたのを外すと通し、使える。
ひょっとして外出?
0555デフォルトの名無しさんNGNG
>>554
手元の処理系で試してみたけど

× gcc version 2.95.4 20020320 [FreeBSD]
○ gcc version 2.96-ee-001003-1
○ gcc version 3.2 (mingw special 20020817-1)

ってことで gcc 2.96 で修正済みのバグと思われ。
0556デフォルトの名無しさんNGNG
>>555
検証サンクス。gcc2.95そのもののバグなのね。
とりあえずB<void>でworkaroundしときます。

これでようやくVC6と合わせられる・・・
0557デフォルトの名無しさんNGNG
stlのmapコンテナで
map<string,int> WD;
としている時に
mapのsecondの値(int)の大小を比較して大きい順にソートするよい方法って
ないですか?
最終的にはそのソートされたfirst(string)を順番に表示したいのですが。
0558デフォルトの名無しさんNGNG
>>557
firstとsecondを逆にして他のmapに挿入し直す。
0559デフォルトの名無しさんNGNG
>>557
ありがとうございます。
intをキー値に持つマップに格納してみます。
0560デフォルトの名無しさんNGNG
STLportのstd::mapとstd::hash_mapの速度がどれくらい違うか実験してみました。
コンパイラはBorland-C++5.6.2です。

hash_map insert(10) = 107
map insert (10) = 114
hash_map lookup(10) = 48
map lookup (10) = 29
hash_map insert(100) = 486
map insert (100) = 708
hash_map lookup(100) = 289
map lookup (100) = 277
hash_map insert(1000) = 5395
map insert (1000) = 7743
hash_map lookup(1000) = 2593
map lookup (1000) = 3586
hash_map insert(10000) = 54202
map insert (10000) = 93014
hash_map lookup(10000) = 28221
map lookup (10000) = 54862
hash_map insert(100000) = 839600
map insert (100000) = 1476372
hash_map lookup(100000) = 335070
map lookup (100000) = 1084240
hash_map insert(500000) = 3934177
map insert (500000) = 9722710
hash_map lookup(500000) = 1835211
map lookup (500000) = 7610511

予想以上の差に驚いています。要素の数が増大すればする程差が開いて
行きますね。
0561デフォルトの名無しさんNGNG
boost::function1<bool,int,int> とか boost::function1<int,int,int> とかを
まとめてvectorとかに入れたいんだけど、どうすればいいかな?
0562デフォルトの名無しさんNGNG
  ∋8ノノハ.∩
   川o・-・)ノ <先生!こんなのがありました!
__/ /    /   
\(_ノ ̄ ̄ ̄\
||ヽ|| ̄ ̄ ̄ ̄||
 ...|| ̄ ̄ ̄ ̄||
http://saitama.gasuki.com/hiroyuki/
0563デフォルトの名無しさんNGNG
>>562
金融のバナーばっかり
0564557NGNG
>>558さんの言うとおりに<string, int>の新しいマップ関数を定義して
firstとsecondを入れ替えてみたのですがこれを出力すると
intの数値が同じものはstring部がすべて表示できませんでした。
このように数値が重複しているものでも別々に出力するにはどうすれば
いいのでしょうか?
0565デフォルトの名無しさんNGNG
>>564
multimap
0566デフォルトの名無しさんNGNG
>564
そのくらいは自分で分かるようになりなよ…。
そもそも連想配列が分かってないんじゃ?
0567デフォルトの名無しさんNGNG
>>564

int main()
{
std::map<std::string, int> si;

si["abc"] = 1;
si["def"] = 1;
si["ghi"] = 2;

std::multimap<int, std::string> is;
std::map<std::string, int>::iterator sii;

for (sii = si.begin(); sii != si.end(); ++sii)
is.insert(std::make_pair(sii->second, sii->first));

std::multimap<int, std::string>::iterator isi;
for (isi = is.begin(); isi != is.end(); ++isi)
std::cout << isi->first << ' ' << isi->second << std::endl;
}
0568デフォルトの名無しさんNGNG
gcc (GCC) 3.2 20020927 (prerelease) on Cygwin(1.3.18-1)でコンパイル通らないんですけど何故に?
ちなみに1次元配列なら全然問題ないんスけど。教えてぷりーず。

#include <vector>
using namespace std;
int main()
{
vector<vector<int> > IntAry;
IntAry.assign(5);// 5 x 6 array
for(int i=0; i<IntAry.size(); i++) IntAry[i].assign(6);
}
0569デフォルトの名無しさんNGNG
>>568
コンパイルエラーを省くなとあれほど・・・・
0570デフォルトの名無しさんNGNG
>>568
vector.assign(int)というメンバ関数はないっス・・・・・・
0571デフォルトの名無しさんNGNG
>>568
この場合はresize()では。
0572デフォルトの名無しさんNGNG
>>568
vector<vector<int> > IntAry(5, vector<int>(6, 0));
0573デフォルトの名無しさんNGNG
getch( )の( )って何のタメにあるの?
中に何か入るの?
0574デフォルトの名無しさんNGNG
>>537
受け取るための袋だろ?
0575デフォルトの名無しさんNGNG
おまいら、アホみたいに頭いいな。感動した。
0576デフォルトの名無しさんNGNG
>>573
関数のプロトタイプないし呼び出しにて、「引数が何も無い」 事を示している。
括弧をつけないと、関数のプロトタイプないし呼び出しではなく関数へのポインタを得る事になる。
0577山崎渉NGNG
(^^)
0578デフォルトの名無しさんNGNG
>>570
スマソ。投稿後すぐに分かった。
>>572
何故分かるの?凄すぎ。出直し逝ってきます。
0579デフォルトの名無しさんNGNG
>>578
std::vectorには、vector c(n, elem) というコンストラクタがある。
elemの要素をn個コピーして初期化する。
って書かなくてもわかるよね。
0580デフォルトの名無しさんNGNG
いい加減にboostをSTLに組み込めと。
0581デフォルトの名無しさんNGNG
いい加減にboostをSTLに組み込めと。
0582デフォルトの名無しさんNGNG
いい加減にboostにSTLを組み込めと。
0583デフォルトの名無しさんNGNG
>>580-582
標準C++の次期規格が固まる時まで無理だと思ふ。
0584デフォルトの名無しさんNGNG
あっboost「に」STL「を」組み込むのか。なぜそんな事をする必要があるの?
そうなったらstdのコンテナは使わないって意味?
0585デフォルトの名無しさんNGNG
>>584
>>582は完全にネタだろ。
0586デフォルトの名無しさんNGNG
Loki::SmartPtrのOwnershipパラメータ用Lokiが定義してるポリシーのうち、
Loki::RefCountedMTだけテンプレートパラメータの数が違う気がするんですが、
これでいいんですか?
gccだとコンパイル通りませんが。

int main(void){
  Loki::SmartPtr<int, Loki::RefCountedMT> p;
  return 0;
}

過去ログ一応見ましたが、がいしゅつだったらご免なさい。
0587デフォルトの名無しさんNGNG
今、boost の weak_ptr のソースを読んでいて、
(文法レベルで)ちょっとわからない事があったのですが、
コンストラクタの引数の

template<typename Y>
weak_ptr(weak_ptr<Y> const & r)

という書き方、これは一体何を表しているのでしょうか?
生のポインタなら Y* const はわかるのですが、それって対応するのは
weak_ptr<const Y> ですよね?
ポインタ自体が const なら const weak_ptr<Y> ですよね?
weak_ptr<Y> const& っていうのは何を表しているんでしょうか?
0588デフォルトの名無しさんNGNG
>>587
const AAA &
と
AAA const &
は同じ意味。
0589587NGNG
>>588
ななななんと!知りませんでした…。そんな書き方ができるとは…。
ありがとうございました。読みづらい…鬱だ…。
0590デフォルトの名無しさんNGNG
>>589
↓こんな話があった。
http://pc3.2ch.net/test/read.cgi/tech/1002252975/594-626
0591587NGNG
質問続きでスミマセン。

VC++6.0 で boost::mem_fn を自作スマートポインタに適用しようとしたら

C:\Program Files\Microsoft Visual Studio\VC98\include\xmemory(34) : error C2660: 'new' : 関数が不正な 2 個の実引数をともなって呼び出されました。
C:\Program Files\Microsoft Visual Studio\VC98\include\xmemory(66) : コンパイルされたクラスのテンプレートのインスタンス化 'void __cdecl std::_Construct(MyPtr<PointeeType> *,const MyPtr<PointeeType> &)' の参照を確認してください

みたいなエラーになりました。何がいけないか以上の情報でわかる人いますか?
ちなみに同じ状況で自作スマートポインタを boost::shared_ptr に変えると
コンパイル通るのです。

>>590
激しく鬱ですね…。ポインタが全て Ptr<PointeeType> みたいな書式になって
配列を int[] num; みたいに書ければ const が全て直後の型に掛かる。で統一できるのに…。
0592デフォルトの名無しさんNGNG
>>591
boost::mem_fn 側ではnewもstd::allocatorも一つも使っていないようだが…。
そのエラーは他の場所が原因に見える。あと、mem_fn を使うには
namespace boost {
  template<typename T> T* get_pointer( const T& p ) { return &*p; }
}
が必要だが、書いてる?

>>589
boost coding guildline。らしい。
http://groups.yahoo.com/group/boost/files/coding_guidelines.html#decl_initialization
■ このスレッドは過去ログ倉庫に格納されています