C++相談室 part61 ..
[2ch|▼Menu]
554:デフォルトの名無しさん
08/04/15 22:43:22
>>552
流れとしてはわりと的を射ている気がするw

555:デフォルトの名無しさん
08/04/15 23:01:58
テンプレートクラスはただの間違いだと思う
クラステンプレートが正しい。だってあれはテンプレートだから

クラステンプレートをテンプレートクラスというのは
鉄パイプをパイプ鉄というようなもの

556:デフォルトの名無しさん
08/04/15 23:16:18
>>555さん
わかりやすい表現ありがとうございます。

教科書には
クラステンプレートはテンプレートクラスから導出できる。
クラステンプレートは非テンプレートクラスから導出できる。
テンプレートクラスはクラステンプレートから導出できる。
非テンプレートクラスはクラステンプレートから導出できる。
と書いてあるのですが・・・

557:デフォルトの名無しさん
08/04/15 23:24:08
まずは本の名前を晒してみれ。

558:デフォルトの名無しさん
08/04/15 23:25:34
なんの哲学書だよw

559:デフォルトの名無しさん
08/04/15 23:26:56
こんにゃくゼリーに使うこんにゃくをゼリーこんにゃくって呼んでる類だろ。

560:デフォルトの名無しさん
08/04/15 23:26:59
ぐぐってでてきた。これは比較的納得できるかんじ
URLリンク(www.ed.kuki.tus.ac.jp)
クラス・テンプレート(class template)
暗黙的にまたは明示的にインスタンスを生成されるか、または特殊化されると、クラス型を作成するテンプレート。

テンプレート・クラス(template class)
クラス・テンプレート(class template)によって生成されるクラス・インスタンス。

561:デフォルトの名無しさん
08/04/16 00:01:31
ソースで出てくる順がtemplate classだから間違えやすいな

562:デフォルトの名無しさん
08/04/16 00:03:46
typename

563:デフォルトの名無しさん
08/04/16 00:49:24
STLに
boost::any相当のものってないよね?

困った困った

564:デフォルトの名無しさん
08/04/16 01:41:23
普通にboost::any使ったら?

565:デフォルトの名無しさん
08/04/16 01:51:09
vectorにデータを追加した時にメモリ確保に失敗した場合、検出する方法ってありませんか?
newでいうbad_allocの例外をキャッチするような感じ。

566:565
08/04/16 02:26:50
解決しました。orz
bad_alloc使えた...

567:デフォルトの名無しさん
08/04/16 03:21:12
>>563
無いなら作れば?
大したもんでもないっしょ。

568:デフォルトの名無しさん
08/04/16 13:24:51
あるアクションゲームをCとC++両方で作りました。
プレイする上で、まったく同じ動作をするものです。

Cでは主に構造体で、C++ではVectorで管理していました。
C++で作ったほうがプログラム実行時のメモリ消費量が多いのですが、
そんなもんでしょうか?

569:デフォルトの名無しさん
08/04/16 13:41:18
そんなもん
完全に同一ソースでもバイナリレベルでは例外処理が入ったり、実行時型判定が入ったりする

570:デフォルトの名無しさん
08/04/16 13:42:03
>>568
Vector は std::vector のこと?
そうなると構造体と std::vector とでは役割が違うので、置き換えれるわけ無いんだけど。

・・・もしかして
struct S { int a, b, c } s;
s.a = s.b + s.c;
これを
std::vector<int> s(3);
s[0] = s[1] + s[2];
にしたってこと?

まぁプログラムが違うんならメモリ消費量が違うのはあたりまえなんで、
あんまり気にしてもしょうがないと思う。同じになるはずっていう根拠でもなければ。

571:デフォルトの名無しさん
08/04/16 13:49:57
配列のことを構造体といい間違えたのではないか。

572:568
08/04/16 14:33:50
配列ですね、すみません。
消費メモリが数十MByte単位で変わってくると、さすがに気になったので質問しました。
C++の設計に改善点がまだあるような気もします。


573:デフォルトの名無しさん
08/04/16 16:51:23
数十MBって、それってC/C++以前にプログラムの構造がおかしいだろ常考

574:デフォルトの名無しさん
08/04/16 17:15:02
> C++で作ったほうがプログラム実行時のメモリ消費量が多いのですが、
これだけ読んだら、普通はもうちょっとささやかな差を想像するよね。
その想像をベースにして皆が一般的なことを回答したところで、いきなり
> 消費メモリが数十MByte単位で変わってくると、
っていう、量に関する新情報を出すっていうのは、広義の「情報小出し質問」だと思うよ。

自分だけが知っている状況を他人に説明するときは、発信する前に
「相手はこの説明に触れて、真っ先にどんなものを想像するだろうか?」
っていう思考を巡らせるべき。

で回答だけど、「構造体とvector」以外に両者のソースがどう違ってるかがわからないと、何とも言えない。
質問文に登場した要素だけで考えるなら、STLの使い方をどこかで根本的に間違えているんじゃないか
って気がするけども。

575:デフォルトの名無しさん
08/04/16 18:22:21
前方反復子のクラスはデフォルトコンストラクタが必要ですけど、
デフォルトコンストラクタで生成した反復子やそれを代入した
反復子に対する操作の結果は定義されているでしょうか?


576:デフォルトの名無しさん
08/04/16 20:42:11
URLリンク(www.asahi-net.or.jp)
このサイトを見ながらC++の基礎を勉強しているのですが、このページのデストラクタのサンプルプログラムを
VC++2008EEに打ち込んでも「消滅しました」のメッセージが出ないのですが、
これはVC++側の処理の問題でしょうか?

577:デフォルトの名無しさん
08/04/16 20:44:49
詳しく読んでないからわからんが、派生クラスで基底クラスのデストラクタが呼び出されないとかなら
virtualが抜けてるからとかそんなんじゃね?

578:デフォルトの名無しさん
08/04/16 20:51:17
まだ始めたばかりの初心者です。。
あまりを出さなくてよい、簡単な割り勘のようなのを作っているのですが、
-
#include<stdio.h>

int main(void)
{
int a,b,c;

/*計算の入力 金額*/
printf("金額を入力してください");
scanf("d%",&a);
/*人数*/
printf("人数を入力してください");
scanf("%d",&b);

/*計算と結果の表示*/
c=a/b;
printf("%d/%d=\t%d\n",a,b,c);

return 0;
}
-
これを実行させると、金額を入力してEnterキーを押した時点で変な数字が出てきてしまいます…
なにか足りない気がしますが、何処がおかしいのでしょうか…?
ご教授よろしくお願いします。

579:デフォルトの名無しさん
08/04/16 20:51:27
どのコードを書いて、どういうメッセージは出たのか、
情報が足りなさ過ぎる。

580:デフォルトの名無しさん
08/04/16 20:52:05
>>579>>576

581:デフォルトの名無しさん
08/04/16 20:53:09
>>578
d%

582:デフォルトの名無しさん
08/04/16 20:53:29
scanf("d%",&a);
打ち間違い?

583:576
08/04/16 21:15:39
>>580
スミマセン。。。
//dest_sample.cppのコードをまるっきりそのまま書いて実行したところ、
実行結果例の下2行の「消滅しました」のつく文だけ表示されません。
問題なくコンパイルできますし、上4行の「生成されました」と「呼び出されました」
の付く文は正常に表示されます。
試しに、筆者が書いたものをコピー&ペーストして実行してみましたが、
やはり「消滅しました」のつく、下2行の文が表示されません。
~Nanika(){
cout << "Nanikaのインスタンス" << datum << "が消滅しました。" << endl;
が完全に無視されているような状態です。

宜しくお願いします。

584:デフォルトの名無しさん
08/04/16 21:29:48
コンパイラは何?

585:デフォルトの名無しさん
08/04/16 21:39:59
namespaceにはまっています。
あるソースファイルのnamespaceで囲まれた関数を別のソースファイルでexternしたいのですが、
どうすればいいかわかりません。コンパイルエラーになります。
名前空間名を付けて呼び出してもだめで・・・。
aaa.cpp-----------------------------------
#include <stdio.h>

namespace hoge
{
void Func()
{
printf("HELLO\n");
return 0;
}
}
bbb.cpp------------------------------------

extern void hoge::Func(); ←コンパイルエラー

void main()
{
hoge::Func() ← コンパイルエラー
Func(); ← コンパイルエラー

return;
}
-----------------------------------------
bbb.cppからaaa.cppの名前空間が見えてないっぽいんですがこんな場合どうしたらいいのかわかりません。
ネットでも検索したのですが、複数ファイルに分ける事ができる記述はあっても
やり方が乗ってないので困ってます。どなたかお願いします。


586:デフォルトの名無しさん
08/04/16 21:41:05
namespace hoge{ extereeeen void Func(); }

587:デフォルトの名無しさん
08/04/16 21:41:27
namespace hoge {
 void Func();
}

int main()
{
 hoge::Func();
}

588:デフォルトの名無しさん
08/04/16 21:45:14
ああ、コンパイラはVC++2008EEか。

589:デフォルトの名無しさん
08/04/16 22:00:46
>>586
bbb.cppでexternする場合はコレもnamespaceで囲んであげないといけないと言うことでしょうか!?
やってみたのですがVC++6.0なせいか hogeがシンタックスエラーを起こしてます。
VC++対応していない?明日会社でやってみます。

>>587
586さんと似てるのですが、externしなくてもよいと言うことでしょうか?
これまたVC++6.0ではhogeがシンタックエラーを起こしています。
明日やってみます。

590:デフォルトの名無しさん
08/04/16 22:56:43
VC6 でも問題はないはずなんだが・・・

591:デフォルトの名無しさん
08/04/16 22:57:30
関数プロトタイプはデフォルトで extern ってのは常識だろ?

592:デフォルトの名無しさん
08/04/16 22:59:45
>>583
VC++2008でやってみたけど、ちゃんと表示されたよ。

593:デフォルトの名無しさん
08/04/16 23:09:05
ひょっとしてNanikaのインスタンスを
グローバルで生成したというオチではないだろうなw

594:デフォルトの名無しさん
08/04/16 23:12:02
外部ライブラリのデストラクタの方が後に走るから
グローバル変数にしても cout に問題はないと思う。
というか、グローバルにしても表示された。

595:デフォルトの名無しさん
08/04/17 01:48:09
#include <boost/regex.hpp>

template<typename TChar>
class TCHoge
{
public:
  typedef boost::basic_regex<TChar>  regex_type;
  static int Func(regex_type reg){ return 0; }//ok
  //static int Func(regex_type::flag_type flag){ return 0; }           // NG1
  //static int Func(boost::basic_regex<TChar>::flag_type flag){ return 0; } // NG2
  static int Func2(boost::basic_regex<char>::flag_type flag){ return 0; }   //OK
};

Window2000
Visual C++ 2005 express edition
boost 1.34.1

 NG1 のように記述したいのですが,以下のようなエラーとなってしまいます.

warning C4346: 'boost::basic_regex<charT>::flag_type' : 依存名は型ではありません。
error C2061: 構文エラー : 識別子 'flag_type'

VC6.0 では問題なかったのですが,どのように記述すれば良いでしょうか?

596:デフォルトの名無しさん
08/04/17 02:07:22
×boost::basic_regex<TChar>::flag_type
○typename boost::basic_regex<TChar>::flag_type

だっけ?あまり自信ないや

597:595
08/04/17 03:25:08
>>596 さん,有難う御座います.教えていただいた方法でうまくいきました.

これから typename をつけまくる作業に戻ります…

それでは.

598:デフォルトの名無しさん
08/04/17 03:48:20
>>575
基本的には全部未定義。唯一、デフォルトコンストラクタで初期化したイテレータに、
そうではない値を代入することができる、ってことになるみたい。
24.1p5 の "Iterators can also have singular values ..." あたりにそんなことが
書いてあって、デフォルトコンストラクタで作った Forward iterator は singular value を
持つ(ことがある)とされている。

要するに未初期化のポインタやヌルポインタと同じ扱いってことね。

599:デフォルトの名無しさん
08/04/17 07:27:26
>>597
VC6 だと逆にエラーになるから
もし VC6 でもコンパイルしたいということになりそうなら
後で切り替えられるようにマクロにしといた方がいい。

600:デフォルトの名無しさん
08/04/17 08:28:19
VC6を窓から捨てるのが正解かと
boostでもVC6は切ってるし

601:デフォルトの名無しさん
08/04/17 10:52:55
>>589
プロトタイプ宣言したヘッダファイルを作れ。
つーか、チミのやりかたではnamespaceつくらなくてもアウチなんだけど

602:デフォルトの名無しさん
08/04/17 12:52:38
stlやboostを使っていると、typedefを書く場所に悩みます。
class ClassA { HogePtr pHoge_; };
class ClassB { HogePtr pHoge_; };
この時、typedef boost::shared_ptr<Hoge> HogePtr;はどこに書くのが理にかなっているのでしょうか?
Hoge.h?それともClassA.hとClassB.h?

603:デフォルトの名無しさん
08/04/17 12:56:08
>>602
typedef しないという選択肢は無いのかね?
ほんとに HogePtr に意味があるなら Hoge.h だろうね。

604:602
08/04/17 13:00:36
>>603
すみませんtypedefしない選択肢もありました。
Hoge.hでtypedefするか、typedefしないかの2択ですね。
ありがとうございました。

605:デフォルトの名無しさん
08/04/17 21:40:19
class Hoge {
public:
typedef boost::shared_ptr<Hoge> ptr_t;
};
というのはどうですか?

606:デフォルトの名無しさん
08/04/17 23:27:03
ClassA や ClassB の実装部分を HogePtr の実体から分離するために
typedef 名をつかうってんなら、いっそ
template class <T> class ClassAImpl { typedef boost::shared_ptr<T> Ptr; ... };
で、
typedef ClassAImpl<Hoge> ClassA;
あたりまでやっちゃうのも悪くないと思うよ。

607:デフォルトの名無しさん
08/04/18 01:14:56
inline std::string Reverse( const std::string & src ){
return std::string( src.rbegin( ), std::rend( ) );
}
これくらいシンプルな感じで実装する方法ないですか?

608:デフォルトの名無しさん
08/04/18 01:21:01
ごめん誰か>>607を翻訳して

609:デフォルトの名無しさん
08/04/18 01:29:32
ようするに逆順でイテレーションしたいんだろうさ

610:デフォルトの名無しさん
08/04/18 01:32:28
実装する手間を惜しんでシンプルな設計を考えることは良いことだが、
人に説明する手間を惜しむのは(・A・)イクナイ!!

611:デフォルトの名無しさん
08/04/18 01:40:34
>>608
すいません。>>609ってことです。しかもstd::rend( )って何だよ・・・orz

当然できんだろ、って思ってたらコンパイルエラーになるんすね。
やっぱcopy使うのが一番まともでしょうか?


612:602
08/04/18 01:45:35
>>605
なるほど、それもありましたか。

>>606
ClassAとHogeの分離は考えてなかったです。
考えていたのは、
1、クラステンプレート実体化のコードが長くなるので、stlやboostはtypedefして使うものだと思っていた。
2、shared_ptrを使うという事は、2つ以上のクラス(スコープ)で型を使う事になるので、typedefを1箇所(Hoge.h)にだけ書いて、参照したほうがいいのではないか?
3、しかし、shared_ptrに入れて使うかどうかは、Hoge.hをインクルードして使う側の選択肢であって、使う側の可能性をHoge.hに書いてしまうのはどうか?
といったことで悩んでいました。

613:デフォルトの名無しさん
08/04/18 02:14:07
>>611
よくわからんが std::reverse でも使っとけ

614:デフォルトの名無しさん
08/04/18 02:24:36
世の中にはある程度の割り切りが必要な時だってあるのさ・・・

615:デフォルトの名無しさん
08/04/18 11:03:18
>>611
make_reverse_range(src) // boost::range_ex
src|reversed // pstade::oven

非標準のライブラリ使ってもいいならこんな感じで簡単に書ける

>>612
HogePtrをtemplateにして
template template parameterでboost::shared_ptr等を与える

// hoge.h
struct Hoge { ... };
template< template<typename T> class Pointer >
struct HogePtr {
 typedef Pointer<Hoge> type;
};

// client code
#include "hoge.h"
template< typename T > struct raw_pointer { typedef T *type; };
HogePtr<raw_ptr> raw;

#include <boost/shared_ptr.hpp>
HogePtr<boost::shared_ptr> shared;

これならhoge.hppで#includeしなくてもよくなる筈

616:デフォルトの名無しさん
08/04/18 13:57:34
>>615
×HogePtr<raw_ptr> raw;
○HogePtr<raw_ptr>::type::type raw;
×HogePtr<boost::shared_ptr> shared;
○HogePtr<boost::shared_ptr>::type shared;
ではなくて?

そもそもhoge.hppでshared_ptr.hppの#includeを避けるなら
// client code
Hoge* raw;
boost::shared_ptr<Hoge> shared;
でいいじゃん?

617:デフォルトの名無しさん
08/04/18 22:57:32
>>581
>>582
返信遅くなってしまいました…
そんな単純なミスだったんですね…
ありがとうございました。

618:デフォルトの名無しさん
08/04/19 15:15:17
ベースメンバ初期化で"this"を使用すると警告がでますが、
コンストラクタ内で"this"を使っても警告も何も出ないけど大丈夫なんですか?

警告が出てるのはインスタンスが生成されていることが保証されて無い状態で
そのポインタを読んでいることが原因になっていると考えているのですが、
だとすると、コンストラクタ内で使っても同じことですよね。

警告が出ないのは、そのポインタの先を使用しなければおkって事なんですかね・・。

619:デフォルトの名無しさん
08/04/19 15:20:45
コンストラクタ内ではメンバの実体は既に生成されているから問題ない
どんな値がはいってるかは知らないけどね

620:618
08/04/19 15:58:08
>>619
>>コンストラクタ内ではメンバの実体は既に生成されているから問題ない
なのに
>>どんな値がはいってるかは知らないけどね
とは?

実体は生成されているけど、thisが指しているのはどこか分からないよ
ってことですか?
それとも、実体の中身に何が入っているか分からないよってことですか?


621:デフォルトの名無しさん
08/04/19 16:00:42
ポインタの先を使用しなけりゃ大丈夫。

622:618
08/04/19 16:12:46
>>621
ってことは、コンストラクタでメンバ関数のアドレスを引き渡すのも危ないってことですよね。

623:デフォルトの名無しさん
08/04/19 16:14:00
コンストラクタ内でそのメンバ関数のアドレスを使わなければ大丈夫。

624:618
08/04/19 16:18:31
>>623
なるほど。理解しました。
どうもありがとうございました。

625:デフォルトの名無しさん
08/04/19 16:18:41
実体は生成される途中にある。
だから、this は存在する。
存在するが、その実体は完全に生成されていないので、
その実体を操作しようとすると色々な不具合が生じる。

1. メンバ変数が全て生成されている保証は無い。
  → メンバ変数に触る関数を呼ぶとヤバい。

2. 仮想関数の呼び出しが正常に働かない。
  → class B : public A { B() : c(this) { } void hoge(); C c; };
    とした時、B のコンストラクタ内から仮想関数 hoge を呼ぶと
    どんな状況であろうが B::hoge が呼ばれるが、
    C のコンストラクタ内から渡されたポインタを使って仮想関数 hoge を呼ぼうとすると
    どんな状況であろうが A::hoge が呼ばれる。
    B の基本的な初期化が済んでないので、B::hoge を呼ぶ事は非常に危険ということでそうなるのだが、
    もちろん A::hoge が呼ばれてしまう事も危険っちゃ危険だ。

626:618
08/04/19 16:37:18
ん...また混乱..

>>1. メンバ変数が全て生成されている保証は無い。
>>  → メンバ変数に触る関数を呼ぶとヤバい。
これだと、例えば,
class AAA {
public:
  // 危険?
  AAA(){
    this->value = 5;
  };
 
  // こちらにしなくてはならない?
  AAA():value( 5 ){
  };
 
  void test(){
    cout<<value<<endl;
  };
private:
  int value;
}
ということ?

627:デフォルトの名無しさん
08/04/19 16:55:31
ここで言っているのは、コンストラクタ以外のメンバ関数のことでしょ。
普通、メンバ関数は、コンストラクタによって適切に初期化済みであることを
前提にして書かれているから、
コンストラクタの途中で呼び出すのは、一般的には危険ということ。

628:デフォルトの名無しさん
08/04/19 17:18:51
GCC でやってみたら C::C 内でも B::hoge が呼ばれた。未定義なのかな?
URLリンク(kansai2channeler.hp.infoseek.co.jp)

629:デフォルトの名無しさん
08/04/19 18:02:59
vptrは初期化リストに先立って初期化されてるはずだから、
実装的には値が不定なだけだと思うけど、
未定義ではあると思うよ。

630:デフォルトの名無しさん
08/04/19 18:04:28
補足。this->nとかの値が不定って意味ね。

631:デフォルトの名無しさん
08/04/19 18:08:30
前に VC6 でやった時は仮想関数テーブルの初期化は最後だったけど、
どっちの仮想関数が呼ばれるかって仕様で決まってんのか?

632:デフォルトの名無しさん
08/04/19 18:15:06
え〜うそ〜!?
基底のコンストラクタから、
派生の仮想関数が呼ばれない、とかの話と勘違いしてない?

633:デフォルトの名無しさん
08/04/19 18:17:17
基底に this は流石に渡さんぜよ。

634:デフォルトの名無しさん
08/04/19 18:32:06
>>631
VC++だと__declspec(novtable)を付けたクラスでは
vtblの初期化が行われないなんて独自拡張がある。
(最派生クラスだけnovtable無しにして使う)

これ使っていないか?

635:デフォルトの名無しさん
08/04/19 19:41:56
novtableいいよねー
コード縮むし

636:デフォルトの名無しさん
08/04/19 20:55:37
    |┃三             
    |┃              
    |┃ ≡    _、_   
____.|ミ\___( <_,` )  
    |┃=___     \   
    |┃ ≡   )ATL 人 \ ガラッ

637:デフォルトの名無しさん
08/04/19 21:20:55
class Derived : Base {...}

void f(){
  Derived v;
}

this->vptr = &Base::vtbl → Base::メンバ初期化 → Base::ctor
→ this->vptr = &Derived::vtbl → Derived::メンバ初期化(定義順にctor) → Derived::ctor

Derived::dtor → Derived::メンバ破棄(定義逆順にdtor) → this->vptr = &Base::vtbl
→ Base::dtor → Base::メンバ破棄(定義逆順にdtor) → this->vptr = 不定値

こういう流れになるはず。VC6も。

638:637
08/04/19 21:28:41
表現がおかしかったので訂正。

× Base::メンバ初期化
○ Base::定義順にメンバ初期化
× Derived::メンバ初期化(定義順にctor)
○ Derived::定義順にメンバ初期化

ctorは「メンバの暗黙の初期化・初期化リストによる初期化」を含まないコンストラクタの中身。
dtorは「メンバのデストラクタ呼び出し」を含まないデストラクタの中身。

639:デフォルトの名無しさん
08/04/19 23:10:47
VCの実装を見る限りcinやcoutはextern修飾されてるみたいですが、
宣言のみの必要な定義のいらないこれらの様なものを自分でも書くとき、
一般的にどのコンパイラでも単にexternを付けておけば良いんでしょうか?

640:デフォルトの名無しさん
08/04/19 23:21:00
externが、必要がでるまでどこかで定義された実体を探す事がないという保証があるかどうか?

641:デフォルトの名無しさん
08/04/19 23:25:46
日h(ry

642:デフォルトの名無しさん
08/04/22 15:26:08
template<class T> struct A { struct B {}; };
template<class T> void f( typename A<T>::B ) {}
と定義して
f( A<int>::B() );
とすると

'void f(A<T>::B)' : テンプレート 引数を 'T' に対して減少できませんでした

というエラーが出るのですが、入れ子クラスではテンプレートの引数を推測でき
ないのでしょうか?

643:デフォルトの名無しさん
08/04/22 15:49:31
f( A<int>::B() );

f<int>( A<int>::B() );
と推測できないかってこと?

それは無理がありすぎるな。

644:デフォルトの名無しさん
08/04/22 17:09:44
逆にboost::implicit_castがこれを使っていて、
推論を抑えるため、引数の型をtypename mpl::identity<T>::typeにしている。

645:デフォルトの名無しさん
08/04/22 19:09:03
BがAのテンプレートパラメータTの値をtypedefの形で保持してそれをf側で参照するようにしてやれば可能になりそうだけど
そうするとfを関数オブジェクトにしないといけなくなってC++の暗黒面に突入する…と
本当にunk言語だな

646:デフォルトの名無しさん
08/04/23 17:10:39
何で
std::auto_ptr<char> x( new int );
はコンパイルエラーにならないんですか?


647:デフォルトの名無しさん
08/04/23 17:19:09
おまえがどんなコンパイラと、どんなSTLの実装使っているのか非常に気になる。

648:デフォルトの名無しさん
08/04/23 17:23:34
コンパイラは VC8 SP1 で STL はコンパイラ付属です。

649:デフォルトの名無しさん
08/04/23 22:11:04
VC8って2005だっけ?
2008ではエラーになったぞ。

650:デフォルトの名無しさん
08/04/24 00:38:29
8は2005

651:デフォルトの名無しさん
08/04/24 09:47:20
VC++2005Expressではエラーになった

652:デフォルトの名無しさん
08/04/24 12:12:58
VC7.1 だとエラーになりました。

Microsoft Visual Studio 2005
Version 8.0.50727.762 (SP.050727-7600)
だとなぜかエラーになりません。

もしかして C++ コンパイラはエラーを出す義務はないのかな?


653:デフォルトの名無しさん
08/04/24 13:26:29
多分それはない。
コンパイラのバグか、誰かがヘッダ書き換えちゃったとか。

654:デフォルトの名無しさん
08/04/24 15:07:19
デバッガで追いかけたら new int が一旦 std::auto_ptr_ref<char> に
変換されてから std::auto_ptr<char> に変換されていました。
std::auto_ptr_ref<T> は void* 型でポインタを記憶しているので
int 型は消えていました。
memory ヘッダーを確かめると確かにエラーが出ないはずです。
この動作は std::auto_ptr の仕様でしょうか?


655:デフォルトの名無しさん
08/04/24 15:34:39
これと同じみたいだね
URLリンク(connect.microsoft.com)

656:デフォルトの名無しさん
08/04/24 15:45:29
いまだに信じられんな。もうすでにVC8なんて使っていないんだが、
それほど悪いコンパイラとSTLじゃなかったはずだが。

とりあえず>>654の話から想像すると、
rvalueとlvalueの境を越えるための、あまり汎用的に使い道のない、
汚いトリックを使ってauto_ptrを実装しているが(オーバーロードとtemplate argument deductionのわずかな違いを利用するやつ)
普通に使う際にも、そのトリックが働いてしまうって事かな。
STLの実装の問題っぽいかなぁ。
ふつうauto_ptr_refのメンバをvoid *にしなければならない理由はないよな。


657:デフォルトの名無しさん
08/04/24 15:48:53
>>655
あ、>>656に加えて、auto_ptr_refのコンストラクタがexplicitじゃないのか。
だめじゃん、P.J. Plaugerさん。

658:デフォルトの名無しさん
08/04/24 19:51:53
失礼
リソースの 切り離し / 復元 を実行するメソッドの命名に困っているのですが
この意味に近くて使いやすい単語のペアはありませんかね?
機能的に必ず対になるものです。

候補としては
[Detach / Restore] Detach の対義語は Attach だしな
[Detach / Attach] Attach は「復元」では無い気がする
[Destruction / Resotre] Destが長い
[Destroy / Restore] Destory は Create のペアとして使ってきたので控えたい
ですが、どうも腑に落ちません。

659:デフォルトの名無しさん
08/04/24 19:58:10
日本語の「切り離し」と「復元」はそもそも対義語じゃないよね・・・
切り離しとその反対なら、Detach / Attach だろうし、
復元とその反対なら、Save / Restore だろう。

Destruction なんて破壊しちゃうわけでさ、英語以前に日本語の
「切り離し」「復元」ってのがそもそも違うんじゃないか?

660:658
08/04/24 20:08:51
>> 659
> 英語以前に日本語の「切り離し」「復元」ってのがそもそも違うんじゃないか?
うーむ・・仰るとおりですね

切り離しを実行すると 消失 という状態になる処理だったので
それを元に戻す意味で 復元 と考えていたのですが
もう少し考え直してみます。 ありがとうございました

661:デフォルトの名無しさん
08/04/24 20:12:44
漏れはホンちゃんの処理の準備のためのナニにはPrepareXXXを結構使うな。
オフスクリーンビットマップやら何やらの準備とか。

662:デフォルトの名無しさん
08/04/24 21:22:36
release / acquire

663:デフォルトの名無しさん
08/04/24 22:20:14
>>660
Disconnect / ReConnect とか、Detach / ReAttach とかは?

664:658
08/04/24 22:43:04
>>661
Prepare
今回は使いそうに無いけど、ひとつ賢くなりました

>>662
そういえば DirectInput に Acquire / UnAcquire (だったかな)ってのがありますね
これ良いかも

>>663
Disconnect / ReConnect
接続とはちょっと違うんですわ

ありがとうございました
スマートに命名出来るように、もうすこし設計から見直すことにします

665:デフォルトの名無しさん
08/04/24 22:50:04
template <template<class> class T>
このようなテンプレートテンプレートパラメータが
なぜこんな書き方ができるのか今一理解できません。
誰か上手いこと説明してください

666:デフォルトの名無しさん
08/04/24 22:59:29
なぜ出来るのかって、そりゃ出来るように言語仕様を改定して
コンパイラが対応したからだろ・・・

667:デフォルトの名無しさん
08/04/24 23:34:09
class X を渡せる奴は
template <class X> と書くんだから
template <class A> class T を渡せる奴は
template <template <class A> class T> と書けるようにするのが自然だろう。
むしろ他にどんな書き方があるのかと問いたい。

668:デフォルトの名無しさん
08/04/24 23:54:08
>>667
あぁ納得。
<template <class A>

最初の例だとAの部分が無かったので混乱してました

669:デフォルトの名無しさん
08/04/25 20:13:29
std::exception のメソッドの例外指定はいつの間にかなくなってしまったんですか?
URLリンク(msdn2.microsoft.com)(VS.80).aspx
を見るのすべてのメソッドに例外指定がないんですけど。
今まで std::exception が例外を投げないことを前提にプログラムを作ってきたんですが。


670:デフォルトの名無しさん
08/04/26 01:47:18
現行規格でも次期規格の最新のドラフトでも throw() ついてるから。

671:デフォルトの名無しさん
08/04/26 02:01:34
だから聞いてるんじゃね

672:デフォルトの名無しさん
08/04/26 10:46:10
throw() は例外を投げない事を保証するが、
unexpected() が呼ばれて落ちる事もあるので
「throw() がついてないからどんな例外が呼ばれるか分からないから
 落ちる可能性があるかもしれないのか不安だよ!」
ってのは意外とナンセンスな悩み。

673:デフォルトの名無しさん
08/04/26 11:32:34
>>672
ナンセンスな私的だな。例外安全性について勉強し直せば。

674:デフォルトの名無しさん
08/04/26 11:35:43
例外指定にない例外を投げたらunexpected()呼ばれるんじゃなかったっけ

つまり例外指定はあんま意味ナス


675:デフォルトの名無しさん
08/04/26 11:40:29
throw()は意味あるよ。関数の実装者がユーザに対して例外を投げない事を保証するものだから。
ユーザはthrow()を見て、例外不送出であることを期待してコードを書く事ができる。

unexpected()が呼ばれる事で、その関数の例外指定に問題があるか、実装に問題がある事をユーザ/実装者が知る事ができる。

676:デフォルトの名無しさん
08/04/26 11:58:31
VCは例外指定無視する(そして"実装されてないお"と警告をだす)のでVC付属のライブラリからも外しちゃったんじゃない?

677:デフォルトの名無しさん
08/04/26 12:02:46
throwをつけると、おき得る例外を特定できるから、それを期待してプログラムを書ける。
なのにそれ以外の例外が投げられるという例外中の例外がunexpectedなのだな。例外にも階層があるんだね。

678:デフォルトの名無しさん
08/04/26 12:16:40
>>676
空のthrow()だけ対応していなかったっけ?

679:デフォルトの名無しさん
08/04/26 12:31:32
>>678
なんかそんな気もする
帰ったら確認してみるよ

680:デフォルトの名無しさん
08/04/26 12:38:39
>>678
そだよ。
書いても警告が出るだけだから。

681:676, 679
08/04/26 20:00:39
vc9で確認してみた

Debugビルドだと、throw()指定がついた関数内に直接throw文を書くとコンパイル時に警告C4297が出る。
実行時はthrow()指定無視

Releaseビルドだと、throw()指定がついた関数内に直接throw文を書くとコンパイル時に警告C4297が出る。
実行時はthrow文のところでterminateによりabort

のようだ

682:デフォルトの名無しさん
08/04/26 20:22:06
VC9は何かバグバグだな
早くSP1出して欲しい
でも年末とか言ってたような希ガス・・・・orz

683:デフォルトの名無しさん
08/04/26 21:26:34
>>669
例外指定があろうとなかろうと、
投げてくる(こない)例外の種類は、規格通りだから安心して使っていいよ。

684:デフォルトの名無しさん
08/04/26 22:13:35
void f( T a ) {}

f の呼び出しで a を生成するときに起きる例外は f の中で発生する
例外ですか,それとも外で発生する例外ですか?


685:デフォルトの名無しさん
08/04/26 22:16:42


686:なにがだ
08/04/26 22:30:18
>>684
f()に入れる前に出ちゃってるんだから大丈夫。

687:デフォルトの名無しさん
08/04/26 22:31:58
もう、出しちゃったの?

688:デフォルトの名無しさん
08/04/27 17:46:33
Winsock2.0で非同期通信について教えてくれ

connectメソッド使ってサーバに接続要求して
サーバ側でACCEPTメッセージちゃんと受け取って
接続できてるのに戻り値が0にならないのは何で?

689:デフォルトの名無しさん
08/04/27 17:58:54
とりあえずWSAGetLastErrorでエラー内容調べてみたら?

690:デフォルトの名無しさん
08/04/27 18:06:54
>>689
やってんだけどわかんないんだ

非同期通信の場合WSAEWOULDBLOCKが返されるのは正常
という記事は見つけたんだけど、鯖立ててない状態で接続しても
WSAEWOULDBLOCKしか返らないからエラー処理出来なくて困ったちゃん

691:デフォルトの名無しさん
08/04/27 18:16:49
URLリンク(msdn2.microsoft.com)
>With a nonblocking socket, the connection attempt cannot be completed immediately.
>In this case, this function will return SOCKET_ERROR and WSAGetLastError will
>return WSAEWOULDBLOCK.

692:デフォルトの名無しさん
08/04/27 20:46:47
C++のnamespaceとオブジェクトに関連した質問させて下さい。

namespace Aにあるクラスまたは構造体のオブジェクトを、
namespace Bのクラスに引数として渡したいのですが、どのように
記述すればいいのでしょう?出来ればnamespace AとBは別々に、
それがダメならnamespace Aの中にBがいるように出来ればと
思っています。

C++を触りはじめたばかりでわかっていないことが多いのですが、
よろしくお願いします。

693:デフォルトの名無しさん
08/04/27 21:26:36
namespace AのclassXなら「A::X」

694:デフォルトの名無しさん
08/04/28 15:26:11
std::vector::size_type 型のオブジェクトは std::size_t 型の
オブジェクトに変換できるでしょうか?


695:デフォルトの名無しさん
08/04/28 16:28:10
>>694
符号なし整数で、difference_typeの全ての非負数を表す事ができる。
としか書かれてないから、実装依存じゃないかな。

696:デフォルトの名無しさん
08/04/28 16:38:32
教えてください。
Visual Studio 2005をつかっています。
クラスのコンストラクタ内で動的に2次元配列を生成し、
ファイルから値を入力したいのですが、
デバッグ(ローカル,this,vec_x内)で確認すると、2次元配列にはなっているのですが、
行数、列数で共に1となってしまっています。
int **vec_x;
int **vec_y;
と宣言し、コンストラクタ内で、
vec_x = new int * [ size_y ];
vec_y = new int * [ size_y ];
for(i = 0; i<size_y; i++){
vec_x[i] = new int[size_x];
vec_y[i] = new int[size_x];
}
size_y,size_xは初回のnewの次点ですでに、
300,200となっていることは確認済みです。

697:デフォルトの名無しさん
08/04/28 16:43:38
>>696
何を根拠に行数、列数が1と判断したのか詳しく。
つーか、vector<vector< int> >使ったら?

698:デフォルトの名無しさん
08/04/28 16:48:51
>>696
デバッガでは配列の要素数は型情報として存在しない限り
表示されないというか new [hoge] で取ったサイズは表示されないというか、
要するにただのポインタなので要素は1つしか表示されないというか、
まぁそんな感じ。

699:696
08/04/28 16:51:46
>>697
デバッグで、ローカル変数タブからです。
this以下、vec_x(int **)を見ると、
(int *)に対応するところが1段しかありませんでした。
さらに、その下(?)の階層にも要素はひとつしかありませんでした。
>>698
その要素に値を入力したとき、
うまく領域が確保できていればどう表示されるんでしょうか。


700:デフォルトの名無しさん
08/04/28 16:59:05
>>699
詳細は>698の通り。そのデバッガは(newで確保した)可変長配列に対応していないのだろう。
確保できていたかどうかを知る手段はない。
確保に失敗したかどうかは例外が送出されるので受け取ればいい。
つーか、>697の最終行。

701:696
08/04/28 17:13:14
むしろ、その後の値の入力に問題があるのかもしれません。
ifstream ifs("FILE_NAME");
ifs >> size_x >> size_y;

for( i = 0;i<size_y;i++){
 for( j = 0;j < size_x; j++){
  ifs >> vec_x[i][j] >> vec_y[i][j];
 }
}
としています。
入力ファイルの中身は、
整数(半角スペース)整数
整数(半角スペース)整数
...
となっており、最初にsize_x,size_yを入力しています。
size_x,size_y,vec_x[0][0]は正しく入力されたのですが、
vex_y[0][0]には正しい値は入っていません。
その後のvex_x,vec_yの各要素の値に関しても同様に正しい値は入力されませんでした。

>>697
STLはややこしくて全く手をつけていません。
お恥ずかしい限りですが…。

702:デフォルトの名無しさん
08/04/28 17:30:54
>>701
g++ で一応試したけど、配列は >>696 で問題無いよ。
俺も STL 使った方がいろいろと簡単だとは思うけど。

703:デフォルトの名無しさん
08/04/28 17:40:17
STLに限らず、まとまった規模の情報は何でもそうだけど、遠目に見ているうちは
頻繁に使うものと滅多に使わないものが「同じ大きさ」に見えるんで、
無駄に全容を眺めてしまって、「難しそうだなぁ」という気持ちばかり膨らんでいく。

実際には「STLを使う」ってのは、その殆どがつまり「コンテナを使う」ってことで、
これ自体はめちゃくちゃ簡単な話だよ。

704:696
08/04/28 18:00:02
ありがとうございます。
STLを勉強してみたいと思います。
今回は(x,y)のようなベクトルによって構成された、
2次元配列を二つ作ることを考えています。
vector<vector< int> > vect1(size_y,vector<int>(size_x));
として、vect1[y][x]として要素にアクセスすればいいのでしょうか。
URLリンク(gimite.net)

この場合のコンストラクタの動作が理解できません。
第二引数のvector<int>(size_x)でvect1を初期化するのでしょうか。

705:デフォルトの名無しさん
08/04/28 18:57:24
>>704
それで使い方はいいよ。

違うよ。2個目の引数は vect1 の各要素を初期化というか instantiate してる。
constructor は 2 つ引数あるときは個数と各要素。

706:デフォルトの名無しさん
08/04/29 21:50:55
>>705
下の文に引用が無いから
> それで使い方はいいよ。
> 違うよ。
が繋がった感じで、なんかワロタ

707:デフォルトの名無しさん
08/05/01 13:42:23
クラスAからpublic派生したクラスBで、クラスA分のメンバ関数をprivateにしたいんですが
Virtual付いてると宣言だけじゃ駄目なんでしょうか?
環境はBCB5+XPです

class a {
public:
void Test1() {};
virtual void Test2() {};
};
class b : public a {
private:
void Test1(); //OK
virtual void Test2(); //リンカエラーが出る
};


708:デフォルトの名無しさん
08/05/01 13:56:01
virtualは関数の実体を定義しないとエラーになるよ。

709:デフォルトの名無しさん
08/05/01 13:58:16
それが許されたとして、aの中でよんでいるTest2はどうなるのか興味浦々

710:デフォルトの名無しさん
08/05/01 14:13:48
う〜んそうだったんだ。
a.Test2()で実体があるから、問題ないんじゃないかと思ってたけど
違うのか。
すごく勉強になったよ。ありがとう〜

711:デフォルトの名無しさん
08/05/01 15:04:23
class b : public a {
private:
using a::Test1;
using a::Test2;
};

やりたいのはこういうことか?

712:デフォルトの名無しさん
08/05/01 17:43:05
>>711
この書き方は知らなかった。
usingについて調べてみます。

713:デフォルトの名無しさん
08/05/04 23:24:42
じぇねれーてぃぶこーどって本
買ったけどC++のソース部分読めない
たじゅけて

714:デフォルトの名無しさん
08/05/05 00:30:03
出版社に送って新しいのと取り替えてもらえ


715:デフォルトの名無しさん
08/05/05 00:47:17
無限ループになる悪寒

716:デフォルトの名無しさん
08/05/05 07:55:38
>>714
当社では、「落丁・乱丁」の場合のみお取替えをさせていただいております。

大変申し訳ありませんが、「ソースコードが理解できない」お客様につきましては、
対応いたしかねますので、ご了承いただけますよう重ねてお願いいたします。

717:デフォルトの名無しさん
08/05/05 13:45:51
>>713
何がそんなに難しいの? template とかの勉強が必要なのかな?

718:デフォルトの名無しさん
08/05/06 00:30:53
じぇねれーてぃぶこーどなんて本あったっけ?

719:デフォルトの名無しさん
08/05/06 00:38:16
日本語ではなかった気がする

720:デフォルトの名無しさん
08/05/06 10:14:01
これかぉ?
URLリンク(www.seshop.com)

721:デフォルトの名無しさん
08/05/06 11:32:55
hoge


722:デフォルトの名無しさん
08/05/06 11:39:15
int main ()
{
static int i (0);
struct Local
{
static void increment ()
{
++ i;
}
};
Local::increment ();
}
関数内のクラスのstaticメンバ関数(Local::increment)から
関数内の変数(i)を触れるのは規格に合ってる?
g++.real (GCC) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
では触れるのだけど.


723:デフォルトの名無しさん
08/05/06 14:12:30
スタティックなメンバ関数からスタティックなメンバ変数が見えるのはいいんでないかい?
別に矛盾はないと思うし。
スタティックなメンバ変数ってのは、スコープ限定のグローバル変数みたいなもんだしね。

724:デフォルトの名無しさん
08/05/06 15:28:06
>>723
そういう事なんだろうね。俺も >>722 さんの code 見てちょっと
えっ?て思ったけど、気分悪いがはっきりと間違っているとも言えない。
実際 compile してみると走るし(g++ 4.1.1)。どちらの static でも
外せば compile しない。

725:722
08/05/06 15:42:33
>>723,724
規格に合っているみたい.

9.8.1に
722ほぼそのまんまの例が載ってました.


726:デフォルトの名無しさん
08/05/06 23:05:22
int* array[10];
ってnewでやる場合どう書けばいいですか?

727:デフォルトの名無しさん
08/05/06 23:07:39
array[0] = new int[931];

728:デフォルトの名無しさん
08/05/06 23:26:29
>>726
もっと分かるように質問しろお( ^ω^)

729:デフォルトの名無しさん
08/05/06 23:31:01
int** array = new int*[10];でしょjk

730:デフォルトの名無しさん
08/05/06 23:32:22
C++のソースコードをアセンブラのコードに変換する方法があるって聞いたんですが
どうやればいいか教えてください
コンパイラはVCです

731:デフォルトの名無しさん
08/05/06 23:34:11
コンパイラオプションで「アセンブリコードを出力する」に設定する

732:デフォルトの名無しさん
08/05/06 23:36:49
730です
ありがとうございます

733:デフォルトの名無しさん
08/05/07 00:02:34
void F( vecotr<int> &vec )
{
struct T
{
void operator()( int i ){ printf( "%d\n", i ); }
};

for_each( vec.begin(), vec.end(), T() );
}

こういう奴で、struct TをFのスコープ外にすると通るんだけど、
スコープ内だと通らない。
なんで?

なんで?って考えちゃダメ?

734:デフォルトの名無しさん
08/05/07 00:04:20
>>733
関数ないクラス、構造体はtemplateクラスやtemplate関数にtemplate引数として渡せないと仕様で決まっている。

735:デフォルトの名無しさん
08/05/07 00:05:23
誤字修正
x 関数ないクラス
o C++仕様もまともに知らない奴は死ね

736:デフォルトの名無しさん
08/05/07 00:07:32
x 関数ない
o 関数内

こういうことだろ

737:デフォルトの名無しさん
08/05/07 00:18:35
x こういうことだろ
o べ、別にあんたの為に修正してやってるんじゃないんだからねっ!

738:デフォルトの名無しさん
08/05/07 00:35:33
>733
C++STDの14.3.1.2で不可になってますな。
コンパイル時に特定する必要があるので、外部リンケージの無い要素を指定できないんですな。
そういう意味で文字列リテラルも不可。
#文字列リテラルを実引数にできると色々と面白いんだけど、しようがないか……

739:デフォルトの名無しさん
08/05/07 00:49:27
外部リンケージ?

740:デフォルトの名無しさん
08/05/07 18:10:55
ケータイ小説・千の風になっての評価

評価者:ミカ  評価:★★★★★
ミカと同じ名前で同じ歳の子がこんなひどい人生を送るなんて!!
信じられない!!
一晩中泣きました!!

評価者:サナエ 評価:★★★★☆
これがあたしたちのリアル。

評価者:ち†ょ⊃ 評価:★★★★★
寝ゐ前|ニ言売ゐ女台め†ニяа止маω†ょ<τ
冫欠σ日シ立L≠†ょカヽ〃яа学木交|ニ彳テL≠маU†ニ



741:デフォルトの名無しさん
08/05/07 19:53:49
ちなつ
寝る前に読み始めたら止まんなくて
次の日泣きながら学校に行きました

同じ文字を複数の文字にあてたり、いきなりローマ字とか出てくるとワケワカメになるね。

742:デフォルトの名無しさん
08/05/07 20:39:31
ドストエフスキー小説・罪と罰の評価

評価者:ラスコーリニコフ  評価:★★★★★
僕と同じ名前で同じ歳の人がこんなひどい人生を送るなんて!!
信じられない!!
一晩中泣きました!!

評価者:ドストエフスキー 評価:★★★★☆
これがあたしたちのリアル。

評価者:ポルフィーリィ 評価:★★★★★
予審前に読み始めたら止まんなくて
次の日泣きながら仕事に行きました

743:デフォルトの名無しさん
08/05/08 00:57:43
おい
自演してる奴がいるぞ
しかも評価は控えめw

744:デフォルトの名無しさん
08/05/09 16:17:28
1         2           3           4

.     __                       __             _ 
    ,i,_,i_        ,-,_         ,-i,_,l 、      :.. :. ≡=-i'__l, 
    |  `i         /'-' `i         //l   l       iコ==ラ`'i ti 
    | lヽi li,   →  | lヽl li   →   l i,,l   l |   →     ./  /l/
    | l-'l |,l       | | // l        `"|iコ=''         /  /
.    'Fヲ|,H      E三l_l_A         | .i .|         /  / 
    ,i_| .| |                   | || |         i' /l .l,
     -'‐'                      | || |_       l l .ヽ,ヽ, 
                          ‐' ' `‐'       -'-'  -'-' 
    脱ぐ       たたむ      プログラムを     src と dest を
                         つくる      まちがえる。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4592日前に更新/200 KB
担当:undef