5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

【C++】template 統合スレ -- Part3

1 :デフォルトの名無しさん:03/10/19 01:04
C++ のジェネリックプログラミングの話をしましょう。
以下のスレッドを統合するスレです。

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

【C++】Boost使い集まれ!
http://pc3.2ch.net/test/read.cgi/tech/1033830935/ (html化待ち?)

Generic Programming with C++ Template
http://pc.2ch.net/tech/kako/1008/10085/1008593126.html
【C++】template 統合スレ -- STL/Boost/Loki, etc.
http://pc2.2ch.net/test/read.cgi/tech/1037795348/
【C++】template 統合スレ -- Part2
http://pc2.2ch.net/test/read.cgi/tech/1047978546/ (html化待ち)

関連スレ、その他リンクは >>2-5 あたりに。

2 :デフォルトの名無しさん:03/10/19 01:06
関連スレ
C++相談室 part23
http://pc2.2ch.net/test/read.cgi/tech/1062690663/

リンク
STLPort
 http://www.stlport.org/

boost
 http://www.boost.org/

Loki
 http://freshmeat.net/projects/lokilibrary/
 http://www.geocities.com/rani_sharoni/LokiPort.html

ISO/IEC 14882
Programming languages -- C++
 http://webstore.ansi.org/ansidocstore/product.asp?sku=ISO%2FIEC+14882%2D1998
 http://www.kuzbass.ru/docs/isocpp/

3 :デフォルトの名無しさん:03/10/19 01:06
boostに関する有名な日本語サイト

・boost info
http://user.ecc.u-tokyo.ac.jp/~g940455/wp/boost/

・Hattareme Programming
http://www.dodgson.org/lab/hat/

・Let's boost
http://www.kmonos.net/alang/boost/

・Regex
http://www.s34.co.jp/cpptechdoc/article/regexpp/

・Boostを使おう
http://www.emaki.minidns.net/Programming/tools/Boost/

4 :デフォルトの名無しさん:03/10/19 01:08
リンク修正(Part2と同じ事やってる(^_^;)
【C++】Boost使い集まれ!
http://pc2.2ch.net/test/read.cgi/tech/1033830935/

5 :デフォルトの名無しさん:03/10/19 01:09
>>1
激しく乙

6 :デフォルトの名無しさん:03/10/19 01:26
あと、腐ったstd::valarrayの後釜として次期標準化の呼び声が高いBlitz++
http://www.oonumerics.org/blitz/

7 :デフォルトの名無しさん:03/10/19 01:33
宣伝ご苦労

8 :デフォルトの名無しさん:03/10/19 06:51
Part4まだかな〜

9 :デフォルトの名無しさん:03/10/19 10:59
Zカレー

10 :デフォルトの名無しさん:03/10/19 17:39
C++相談室 part24
http://pc2.2ch.net/test/read.cgi/tech/1066546387/

11 :デフォルトの名無しさん:03/10/19 17:45
次スレ
http://pc2.2ch.net/test/read.cgi/tech/1065535118/

12 :デフォルトの名無しさん:03/10/19 18:06
>>11
次ぎスレはいらないって・・・・ぷっぷぷぷ

13 :デフォルトの名無しさん:03/10/19 18:07
次スレを「つぎすれ」と読むのは小学生に違いない。
小学生もテンプレートメタプログラミングをする時代になったのか。

14 :デフォルトの名無しさん:03/10/19 18:08
閑古鳥が鳴いています。

15 :デフォルトの名無しさん:03/10/19 18:14
日本シリーズ見るから静かにしてください

16 :デフォルトの名無しさん:03/10/19 23:51
std::valarrayって、具体的にどう腐ってるんだろう


17 :デフォルトの名無しさん:03/10/20 01:29
>>16
1.サブセットを取り出す場合明示的なキャストが常に必要となる。
2.slice同士の演算も明示的なキャストが必要であり面倒。
3.sliceをvalarrayに変換する際に巨大な一時的なオブジェクトが
  作られ、パフォーマンスが悪い。

結果としてFORTRANの代替用として使うにはあまりにも効率が悪すぎ、
書式も複雑になりすぎる嫌いがある。

本当はこの当たりをもっと煮詰めてから標準化する予定だったらしいが、
std::valarrayの開発者が途中で標準化委員会を抜けてしまったため、ほ
とんどそのまま放置され、未完成のまま世に出てきたと言われている。

18 :デフォルトの名無しさん:03/10/20 02:53
おそらく標準委員会の方達に嫌気がさしたのでしょう

19 :デフォルトの名無しさん:03/10/20 08:03
その名は、Kent "Frankenstein" Budge。

20 :デフォルトの名無しさん:03/10/20 14:17
つかなんでvector<bool>は特殊化したのよ。
そんなビット単位でぎちぎちに詰めたいやつはそもそもvectorなんか使わんでしょうに。

21 :デフォルトの名無しさん:03/10/20 17:15
悪い特殊化の見本に。

22 :デフォルトの名無しさん:03/10/20 18:08
その調子で組込型のvector全部特殊化して欲しかったな。

23 :デフォルトの名無しさん:03/10/21 15:15
>>22
全部って何を?
俺はvoid*の特殊化がほしいけど

24 :デフォルトの名無しさん:03/10/22 18:57
マスタをlistにつんで検索とかやってますが、マスタの件数が多くなるとさすがに遅い。
listじゃなくvectorにして二分木検索とかにしたら早いかなと思ってますが、そんなサンプルなんてどこかに落ちてないですか?

自分でしこしこ作らないと駄目かなぁ?

25 :デフォルトの名無しさん:03/10/22 19:04
>>24
二分木探索なら STL の <algorihm> で提供されてるぞ。lower_bound, upper_bound

26 :デフォルトの名無しさん:03/10/22 19:05
std::mapの代わりに整列済みstd::vectorを使うってのならLokiにあるが。

27 :デフォルトの名無しさん:03/10/24 20:20
>>26
AssocVector ?

28 :デフォルトの名無しさん:03/10/25 12:02
VS.NET 2003 のC++コンパイラのバージョンってどれなんでしょうか?
バージョン情報をみても Microsoft Visual C++ .NET ******-***-********-***** としか書いて無いんです。
というのは
http://boost.sourceforge.net/regression-logs/
を見ていて、このコンパイラはどれに当たるのだろうかと?


29 :デフォルトの名無しさん:03/10/25 12:04
>>28
VC++ 7.1

ちなみに素の VS.NET が VC++ 7.0

30 :デフォルトの名無しさん:03/10/25 12:09
>>29
あっ、どうもです

31 :デフォルトの名無しさん:03/10/26 14:16
boost::lambda::bind<int>(
とやるとVC7.1が固まってしまう...
再インスコしたら直ります?


32 :デフォルトの名無しさん:03/10/26 14:20
してみろよ。

33 :デフォルトの名無しさん:03/10/26 17:28
>>31
コンパイル時でなくて、コード入力時(インテリセンスの問題)だよな?
だったら、たぶん直らない。
自分の環境でも、100%固まる特定の記述が何回かあった。
いつも、そこだけ他のテキストエディタで書いて誤魔化している。

34 :31:03/10/26 18:11
>>33
やはりそうでしたか。
とりあえず、
テキストエディタの設定で
パラメータヒントをOFFにしてみたら
固まる症状はでなくなりました。
ありがとうございました



35 :デフォルトの名無しさん:03/10/27 22:46
すいません、人様に教えて頂いたコードが2,3日かけてもまるでわかりません。
std::mapが入ってくるんで一応こっちで聞かせてください!
やりたいことは、拡張子に対応するアイコンのインデックス値を
システムイメージリストから調べて拡張子をそのまま変数に、対応するインデクス値を「値」に、
AnsiString jpg=3;
AnsiString html=6;
(みたいにして構造体に突っ込んでいく)というものなのですが、
教えて頂いたのが以下のコードです。

class IndexMap {
 std::map<AnsiString, int> index_map;
public:
 int operator()( const AnsiString& ext ) {
 if ( index_map.find(ext) == index_map.end() ) {
  //indexの取得
  index_map[ext] = index;
 }
 return index_map[ext];
};

んで毎回拡張子を判定してアイコンをリストビューに表示させてた以前のコードがこれ

void __fastcall TForm1::AddListView( const AnsiString DirName , TListItem *Items )
{
AnsiString Ext =ExtractFileExt( DirName );
SHFILEINFO fileinfo;
::SHGetFileInfo( Ext.c_str(), NULL, &fileinfo,
sizeof(fileinfo),SHGFI_USEFILEATTRIBUTES | SHGFI_ICON | SHGFI_SMALLICON );
 Items->ImageIndex = fileinfo.iIcon;
}

36 :デフォルトの名無しさん:03/10/27 22:46
教えて頂いたコードのoperator()()(オブジェクト関数、らしい…)とか検索しても
上手く使い方が見つからないし、どうやって使ったらいいかお手上げ状態で、
我流にやってもエラーばっかり出ます。
[C++ エラー] hoge.cpp(50): E2015 '_fastcall System::operator +(int,const System::Currency &)' と '_fastcall System::operator +(int,const System::Variant &)' の区別が曖昧
おまけにこちらも初めて見るstd::mapがどう動いているのかもわからないし…。
お願いします、この場合、以前のコードをどう組み込んで、
どういうオブジェクト関数の呼び方をするのが正解なんでしょうか。
よければ正解のコードを教えて頂ければ自分であれこれ試して勉強させて頂きます。

37 :デフォルトの名無しさん:03/10/27 22:50
あ、すいません、カッコがちゃんと閉じてなかったですね

class IndexMap {
 std::map<AnsiString, int> index_map;
public:
 int operator()( const AnsiString& ext ) {
  if ( index_map.find(ext) == index_map.end() ) {
   //indexの取得
   index_map[ext] = index;
  }
 return index_map[ext];
 }
};

38 :デフォルトの名無しさん:03/10/27 22:58
IndexMap map;
int index = map( ".jpg" );
オブジェクト関数か・・・関数オブジェクトの間違いだと想像しておく。

エラーメッセージの詳細は最低限ソース晒してコンパイラスレ池。
どうせintと変なオブジェクトの加算をしてるが、その変なオブジェクトからVariant、Currencyへの変換が定義されててどっち使えばいいかわから無いってことじゃねぇの?

map はソースか本読め。

39 :デフォルトの名無しさん:03/10/27 23:03
>>37
これでいいでそ。スタティックメンバ変数は、どっかに
std::map<AnsiString, int> IndexMap::index_map;
って実体書いといてね。

class IndexMap {
 static std::map<AnsiString, int> index_map;
public:
 static int Ext2Index(const AnsiString& ext) { ... };
};

void __fastcall TForm1::AddListView( const AnsiString DirName , TListItem *Items )
{
 AnsiString Ext =ExtractFileExt( DirName );
 Items->ImageIndex = IndexMap::Ext2Index(Ext);
}


40 :デフォルトの名無しさん:03/10/28 00:15
>>38
アドバイスどうもありがとうございます!
>>39
ああ、ありがとうございます!でも駄目です!
コンパイルエラーは出なくなったんですが、
アプリケーションのくだんの関数実行中にエラーが出てきます。むう。
「モジュール'vcl60.bpl'のアドレス 4013D550でアドレス6F726404に対する読み込み違反がおきました。」

とりあえず.cppの#includeの下に以下を書いたんですが…
自分で書いた怪しいところはコメントアウトしてから実行しました。

class IndexMap {
static std::map<AnsiString, int> index_map;
public:
static int Ext2Index(const AnsiString& ext) {
//SHFILEINFO fileinfo;
//::SHGetFileInfo( ext.c_str(), NULL, &fileinfo,
//sizeof(fileinfo),SHGFI_USEFILEATTRIBUTES | SHGFI_ICON | SHGFI_SMALLICON );
//return fileinfo.iIcon;
};
};
std::map<AnsiString, int> IndexMap::index_map;

あと、基本的にアイコン付きのリストビュー表示を可能な限り早く行うための関数なので、
可能な限りSHGetFileInfo()をの数を減らす、つまり、既出の拡張子は即座にアイコンindex値を
返すのが目的なんです。
なのですでに登録されてる拡張子はすっ飛ばしてindex値を返す処理が必要だと思うんですが、
これってもしかして別関数でファイルを検索してこのIndexMapが呼ばれるたびにSHGetFileInfo()
が実行されちゃうんでしょうか…。

しかし、こういう呼び方するんですね、勉強になりました…。
IndexMap::Ext2Index(Ext);

41 :デフォルトの名無しさん:03/10/28 00:52
なんでstatic?

class IndexMap
{
 typedef std::map<AnsiString, int> map_type;
 map_type m_map;
public:
 int operator()( const AnsiString& ext ) {
  map_type::iterator const bound = m_map.lower_bound( ext );
  if ( bound != m_map.end() && !m_map.key_comp()( ext , bound->first ) ) {
   return bound->second; // すでに登録されている
  }
  // 新しく登録
  int const index = m_map.size();
  m_map.insert( bound , map_type::value_type( ext , index ) );
  return index;
 }
};

で、インデックスは連番でいいのかな?

42 :デフォルトの名無しさん:03/10/28 01:28
なんでスタティックかというと、拡張子 -> システムアイコンリストのインデックスなんて
いう map はシステムで1個あればよいものだから。シングルトンにするほどのものでも
ないし。

インデックスは連番じゃなくて、
SHFILEINFO fileinfo;
::SHGetFileInfo( ext.c_str(), NULL, &fileinfo,
 sizeof(fileinfo),SHGFI_USEFILEATTRIBUTES | SHGFI_ICON | SHGFI_SMALLICON );
return fileinfo.iIcon;
こんな感じで得られる。

ところで、40 はこんなことろでグダグダ質問してないで、C++ とか C を勉強したほうがいいよ。
こうやって人に聞くことには何の意味もないよ。

43 :デフォルトの名無しさん:03/10/28 01:44
つか、>>40氏よ。初心者スレ立ってるよ。

44 :デフォルトの名無しさん:03/10/28 01:55
>>41
あぁ、ありがとうございます!なにやら光が見えてきましたぁ!ような気がします_| ̄|○
難しいですねー。ありがとうございます。

>>42
先ほど答えて頂いた方ですね。その節はどうもありがとうございます。
参考書も何もなしで、webに転がってる解説だけで来たんですがそろそろ限界です(;´Д`)
プログラムと言えばちょっとperlのcgi改造するくらいとFlashのアクションスク(ry

>>43
あぁ、ご親切どうも。実はあっちで以前に聞いて教えて頂いたコードが難しくて、
延々と検索してもいまいちわからなかったので
関係ありそうなこちらで聞かせて頂いたんです。


45 :デフォルトの名無しさん:03/10/28 23:45
>>42
システムで唯一でなければならないならともかくその程度ならstatic使うほうが
後々問題になる確率が高そうだが。


46 :デフォルトの名無しさん:03/10/29 14:15
>>45
システムで唯一でなければならないんですよ。

47 :デフォルトの名無しさん:03/10/30 00:39
次のBoostは来月か・・・


48 :デフォルトの名無しさん:03/10/30 12:52
>>46
だったら IndexMap のインスタンスを static にすればいい。
「拡張子 -> システムアイコンリストのインデックス」が「システムで唯一でなければならない」としても、
class IndexMap のメンバを static にする必要は無い。

49 :デフォルトの名無しさん:03/10/30 15:11
>>48
どんなクラスの static 変数にするのが妥当だと思います?
典型的なシングルトンパターンで、かつ初期化に関する問題の無いもの
だから、このクラス単体で(何かを) static にしとくのが良いと思うんだけど。。

煽りじゃなくて、単純にどういう方法論から出てくる意見なのか知りたくて
質問しますた。


50 :デフォルトの名無しさん:03/10/30 18:27
>>49
多分俺ならIndexMapをクラスにせず
class FileSystem
{
 static std::map<AnsiString, int> ExtensionToIconIndex;
};
にすると思う。
拡張子とかイメージリストのインデックス、という情報はデータの構造ではなく意味だから。

マップに入れるデータの意味ごとにいちいちクラスを作っていたら爆発するよ。


51 :デフォルトの名無しさん:03/11/01 18:00
auto_arrayみたいなものが欲しい時はLoki入れるか自作しないとだめ?

52 :デフォルトの名無しさん:03/11/01 18:17
boostにあるよ

53 :デフォルトの名無しさん:03/11/01 18:23
>>52
thx!
でもsandboxか・・・
コピペして使ってみるよ。

54 :デフォルトの名無しさん:03/11/01 18:27
>>51
std::vector
boost::scoped_array

55 :デフォルトの名無しさん:03/11/01 19:05
STLport-4.6 age

56 :デフォルトの名無しさん:03/11/03 03:10
using namespace std;
vector<pair<int, int> > pairs;
pairs.push_back(pair<int, int>(1,5));
pairs.push_back(pair<int, int>(2,10));
pairs.push_back(pair<int, int>(3,3));
pairs.push_back(pair<int, int>(4,8));
//second()の小さい順にソート
sort(pairs.begin(), pairs.end(), boost::bind<
less<int, int>(),
boost::bind<pair<int, int>::second, _1>,
boost::bind<pair<int, int>::second, _2> >);

こんなことやってる人居ますか?

57 :デフォルトの名無しさん:03/11/03 09:13
コンパイルとおらないね。

58 :デフォルトの名無しさん:03/11/03 09:14
それコンパイルとおる?

59 :58:03/11/03 09:18
かぶった。俺だったらこうする。

struct cmp{
bool operator ()(const pair<int, int> &a,const pair<int, int> &b){
return a.second<b.second;
}
};
sort(pairs.begin(), pairs.end(),cmp());


60 :デフォルトの名無しさん:03/11/03 11:06
>>59
ファンクタにコンストラクタつけて、lessとgreaterの両方を比較する
オプション付けるとか。

61 :デフォルトの名無しさん:03/11/03 11:50
>>60
意味わかんない。

62 :デフォルトの名無しさん:03/11/03 14:14
>>61
std::sortの第3パラメータにstd::lessとかstd::greaterとかの事前定義の
BinaryPredicateを与えると便利という意味。

std::sort(paris.begin(), pairs.end(), cmp(std::greater<int>())); とかね。

63 :デフォルトの名無しさん:03/11/03 14:54
ちくしょう。cmpのコンストラクタに引数をstd::binary_predicate<const Pairs&, const Pairs&,
bool> で受けたけどうまくいかない。仕方ないからenumで受けた。
関数オブジェクトって初期化時にパラメタとして渡せないんだっけ?

typedef std::pair<int, int> Pairs;
enum Mode {less, greater};

struct cmp {
cmp(const Mode& p) {
if (p == greater) m = greater;
else m = less;
}
bool operator()(const Pairs& a, const Pairs& b) const {
return a.second < b.second;
}
private:
Mode m;
};

64 :デフォルトの名無しさん:03/11/03 14:55
続き

std::ostream& operator<<(std::ostream& os, const Pairs& p)
{
os << p.first << ' ' << p.second;
return os;
}

int main()
{
std::vector<Pairs> pairs;
pairs.push_back(Pairs(1,5));
pairs.push_back(Pairs(2,10));
pairs.push_back(Pairs(3,3));
pairs.push_back(Pairs(4,8));

//second()の小さい順にソート
std::sort(pairs.begin(), pairs.end(), cmp(greater));

std::copy(pairs.begin(), pairs.end(), std::ostream_iterator<Pairs>(std::cout, "\n"));
}

65 :デフォルトの名無しさん:03/11/03 14:56
ちいとcmpを修正。

struct cmp {
cmp(const Mode& p) {
if (p == greater) m = greater;
else m = less;
}
bool operator()(const Pairs& a, const Pairs& b) const {
return (m == less) ? a.second < b.second : a.second > b.second;
}
private:
Mode m;
};

66 :58:03/11/03 15:10
毎回余分な比較が入るぞ、それ。見本として作るならこうかな。

template <class Fun>
struct cmp2nd_t {
cmp2nd_t(Fun f):fun(f){}
template <class T,class U>
bool operator()(const T& a, const U& b) const {
return fun(a.second,b.second);
}
private:
Func fun;
};

template <class Fun>
inline cmp2nd_t cmp2nd(Fun fun){
return cmp2nd_t(fun);
}


sort(p.begin(),p.end(),cmp2nd(std::greater<int>()));


試してないからコンパイル出来ないかも

67 :58:03/11/03 15:11
template <class Fun>
inline cmp2nd_t<Fun> cmp2nd(Fun fun){
return cmp2nd_t<Fun>(fun);
}

68 :デフォルトの名無しさん:03/11/03 15:26
>>66>>67
すげぇ、通りました。ありがとうございます!
関数オブジェクトを関数ポインタとして持ってしまうのかな?
std::greaterとstd::lessの二種類でソートしてみると、
デバッグで追いかけるとそれぞれの2項関数オブジェクトの
cmp2nd_tの実体が作られ、それぞれを別個にCALLしていま
した。最適化によってstructの中身が分解されたみたいです。
(Borland-C++ 5.6.4)

それにしても標準の二項述語をいきなりtemplateで受けるとは
恐れ入りました。もっと精進します。

69 :56:03/11/03 17:29
すみません、ちょっと間違えていました。

//secondの小さい順にソート
sort(pairs.begin(), pairs.end(), boost::bind(
less<int, int>(),
boost::bind(&pair<int, int>::second, _1),
boost::bind(&pair<int, int>::second, _2)));

vc7.1で通りました。

70 :デフォルトの名無しさん:03/11/03 17:53
しかし、ちょっと話題はずれるけど、

std::ostream& operator<<(std::ostream& os, const Pairs& p)
{
os << p.first << ' ' << p.second;
return os;
}

std::copy(pairs.begin(), pairs.end(), std::ostream_iterator<Pairs>(std::cout, "\n"));

このコードBCCでは通るけど、VC7.1、gcc3.1.1(MinGW)では通らねーな。
std::coutなどに<<を食わせるのと、std::ostream_iteratorに食わせるのでは
何が違うのかな。

71 :デフォルトの名無しさん:03/11/03 19:43
だめ、降参俺にはその問題解けないわ。
vc7.1の場合、内部的には
basic_ostream<char,char_traits<char> >* myos = &cout;
*myos << pairs[?];
こんな事やっているだけなのになんでだろう
コンパイル順序が関係してるとしか思えなのだがわからない。

72 :デフォルトの名無しさん:03/11/03 19:52
>>71
不思議だよねえ。でも多分標準準拠度は
VC7.1>gcc3.3.1>BCCだから、BCCが甘いだけなのか、
BCCはSTLPortを標準搭載だからVC7.1やgccにSTLPortを
入れたら通るのか、これは実験の余地がある。
丁度STLPort4.6が出た所だし試してみるか。

73 :デフォルトの名無しさん:03/11/03 20:21
>>72
よろしくお願いします。・・・・。
\(*⌒0⌒)bがんばって♪

74 :デフォルトの名無しさん:03/11/03 20:29
>>73
でもさ、STLPortのビルドって難しいので有名なんだよね。
いまちょっとMinGWでやってみたら「コマンドラインが違います」とか
4連発で出てきやがった。cppllで聞いてみるか。バカにされるか
相手にされないかのどちらかだろうな。

75 :デフォルトの名無しさん:03/11/03 22:45
boostのthread使いたいんだけど
VC7.1+STLportのiostreamでどうやってビルドすればいいんだろ?
オプションとしてmsvc-stlportとvc7.1ってのがあるんだけど
どちら選べばうまくいくんだろ

76 :デフォルトの名無しさん:03/11/04 00:32
>>70
namespace が鍵のようだ。

77 :デフォルトの名無しさん:03/11/04 01:07
>>76
namespace std
{
  std::ostream& operator << (std::ostream& out, const std::pair<int,int>& p)
  {
    out<<p.first<<' '<<p.second;
    return out;
  }

}
ほんとだべ。
♪ルンルン♪o(^0^o)♪~(o^0^)o ~♪♪~o(^0^o)~♪(o^0^)o~♪ランラン♪
でも一回目試したときはうまくいかなかったよう気がしたんだけどな。
やり方がわるかったのか。
>>72にも早く教えてやらねばー
やっぱり、まだvc7.1の最強伝説は崩れなくてよかった。www

78 :デフォルトの名無しさん:03/11/04 01:14
> やっぱり、まだvc7.1の最強伝説は崩れなくてよかった。www
vc7.1持ってないんだけどさ、
・非const参照に一時オブジェクトがバインドされる
・メンバ関数へのポインタが & 無しで取れる
とか、「コンパイルが通ってしまう」系のバグも直ってるの?

79 :デフォルトの名無しさん:03/11/04 01:38
>>78
直ってない。
>・非const参照に一時オブジェクトがバインドされる
warningにはなる。
>・メンバ関数へのポインタが & 無しで取れる
単純なメンバ関数ポインタなら何も言わずに通るが、特定の状況では&付きの記述が必要。
(ただ、これはこれで便利なんだよな。)

80 :デフォルトの名無しさん:03/11/04 02:07
>>77
それじゃ解決して無いだろ。

81 :デフォルトの名無しさん:03/11/04 07:40
>>77
名前のルックアップが出来ないためだと思われる。
もし二個目の引数がstd::pairじゃなく独自のものだったらちゃんとなると思う。


名前のルックアップ(Keonig ルックアップとも呼ばれる)とは、
パラメータクラスに関係のある非メンバ関数を
public インタフェースのものと拡大解釈することにより、名前の修飾の省くことをいう。

82 :デフォルトの名無しさん:03/11/04 08:35
>>81
  std::cout << pairs[0] << "\n";
// std::copy(pairs.begin(), pairs.end(), std::ostream_iterator<Pairs>(std::cout, "\n"));

上がオーバーロード有効で下がオーバーロード無効なのが問題なので、
「名前のルックアップが出来ない」わけじゃないと思う。

83 :デフォルトの名無しさん:03/11/04 09:29
>>77
72です。
おわっ、本当だ。通る。
operator<<にstd::pairを渡すとこういう罠があったとは・・・・・

>>82
そうなんですよ。俺も同じ事をやってみたら上はちゃんと
通るので、??と頭をかしげていました。std::ostreamクラス
のfriendとして<<を定義できれば問題もなくなるかも・・・って
そういう問題じゃないな。

Effective STLのP176で、boost::shared_ptrのlessをstdの中
に入れている例があるが、今回もこれと同じようなケースかいな。

84 :デフォルトの名無しさん:03/11/04 09:39
> Effective STLのP176で、boost::shared_ptrのlessをstdの中

それは特殊化を同じ名前空間で行う必要があるからで、今回の件とは別だと思います。

85 :78:03/11/04 10:25
>>79
情報ありがとう。
バグだってのはわかってるはずなのに変わってないって事は、
MSの都合なんだろうな。

86 :78:03/11/04 10:41
s/変わってない/直ってない/

87 :デフォルトの名無しさん:03/11/04 11:20
>>86
いや、バグじゃないような気がします。
なんか、プログラミング言語C++第3版の名前空間の名前の照合というところで(p.224)
関数は呼び出しのスコープ(いつものとおり)とすべての引数の名前空間(各引数のクラス、基底クラスを含む)から
探索され、見付かったすべての関数の中で通常の多重定義解決が行われる。

ゆえに、名前空間内のクラスからは宣言でもしない限りグローバルなスコープが存在しないのが
正しい解釈なのではないのでしょうか違いますかね?

英語よめんからこんな解釈しか出来なくすみません


88 :デフォルトの名無しさん:03/11/04 11:24
「あ゛」ちがったごめんなかった事にしてください

89 :デフォルトの名無しさん:03/11/04 16:25
で、誰かSTLPort4.6のMinGWでのビルドに成功した人いる?

90 :デフォルトの名無しさん:03/11/05 07:56
ようやくみつけたような気がする。

14.6.4 -1-
"In resolving dependent names, names from the following sources are considered:
 ・Declarations that are visible at the point of definition of the template.
 ・Declarations from namespaces associated with the types of the function arguments
  both from the instantiation context and from the definition context."

ということで、
"Dependent name"(テンプレート引数に依存した識別子およびoperator)の解決には以下のものが考慮される。
・テンプレート定義の時点で可視となる宣言
・関数引数の型に関連するnamespace中で定義時および実体化時両方のコンテキストの宣言

>>70の例では、 operator<< の解決に
・ostream_iterator::operator= の定義時で可視な operator<<
・namespace std の中の operator<<
が使われることになり、 ::operator<< は見つからない。

つまり、typedefの属するnamespaceは引数に関連しているとはみなされず、
引数に依存した参照が、見た目から期待される範囲と異なることがあるので注意が必要ってわけですよ。

91 :デフォルトの名無しさん:03/11/05 12:32
>>90
70です。わざわざ探して下さってありがとうございました。
namespace stdの中に入れる小技も教えて頂きました。

さらなるSTLの使用拡大に向けて社内でも勉強会などで
どしどし洗脳していきます。車輪の再発明は避けたいし。

92 :87:03/11/05 13:01
でも、こんな落とし穴があったとは今まで誰も疑問に思わなかったのだろうか。
これからはSTLでグローバルなオーバーロード関数を使いたいときははstd空間でぐぐらなきゃ。


93 :デフォルトの名無しさん:03/11/05 15:30
>>92
落とし穴っつーか・・・常識だが?

94 :87:03/11/05 15:59
>>93
そうだったのか。
。・°°・_〆(・o・ ;)・°°・。メモメモメモメモ・・・

95 :デフォルトの名無しさん:03/11/05 16:42
>std::ostream &operator<<(std::ostream &, const std::pair<int, int> &)
こんな多重定義をしてはならんと思うのは漏れだけ?

96 :デフォルトの名無しさん:03/11/05 17:20
>>95
ではどうすればいいと?

97 :デフォルトの名無しさん:03/11/05 17:30
>>96
少なくともひとつの、「自分で定義した」型に依存させる
例えば、
class My_pair : private std::pair<int, int>{/* ... */};
std::ostream &operator<<(std::ostream &, const My_pair &);

std名前空間の引数しか取らない演算子はstdの実装者のみ定義して良いような気がする。

98 :87:03/11/05 17:43
>>96
それコンパイルしてみた?

99 :87:03/11/05 17:47
ごめん勘違い死んできます。
private継承だったのね

100 :87:03/11/05 17:52
あれ?publicでもうまくいっちまった。
あ、勘違いしまくり My_pairのスコープがoperator<<と同じじゃねーか。
もう、−−−だめだめですね。

289 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.02 2018/11/22 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)