[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 07/16 11:48 / Filesize : 200 KB / Number-of Response : 824
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part61



1 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 19:37:43 ]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

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

578 名前:デフォルトの名無しさん [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 20:51:27 ]
どのコードを書いて、どういうメッセージは出たのか、
情報が足りなさ過ぎる。

580 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 20:52:05 ]
>>579>>576

581 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 20:53:09 ]
>>578
d%

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

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

宜しくお願いします。

584 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 21:29:48 ]
コンパイラは何?

585 名前:デフォルトの名無しさん [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 21:41:05 ]
namespace hoge{ extereeeen void Func(); }

587 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 21:41:27 ]
namespace hoge {
 void Func();
}

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

588 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 21:45:14 ]
ああ、コンパイラはVC++2008EEか。

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

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

590 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 22:56:43 ]
VC6 でも問題はないはずなんだが・・・

591 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 22:57:30 ]
関数プロトタイプはデフォルトで extern ってのは常識だろ?

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

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

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

595 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 02:07:22 ]
×boost::basic_regex<TChar>::flag_type
○typename boost::basic_regex<TChar>::flag_type

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

597 名前:595 mailto:sage [2008/04/17(木) 03:25:08 ]
>>596 さん,有難う御座います.教えていただいた方法でうまくいきました.

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

それでは.

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

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

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

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

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

602 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 12:56:08 ]
>>602
typedef しないという選択肢は無いのかね?
ほんとに HogePtr に意味があるなら Hoge.h だろうね。

604 名前:602 mailto:sage [2008/04/17(木) 13:00:36 ]
>>603
すみませんtypedefしない選択肢もありました。
Hoge.hでtypedefするか、typedefしないかの2択ですね。
ありがとうございました。

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



606 名前:デフォルトの名無しさん [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 01:14:56 ]
inline std::string Reverse( const std::string & src ){
return std::string( src.rbegin( ), std::rend( ) );
}
これくらいシンプルな感じで実装する方法ないですか?

608 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 01:21:01 ]
ごめん誰か>>607を翻訳して

609 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 01:29:32 ]
ようするに逆順でイテレーションしたいんだろうさ

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

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

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


612 名前:602 mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 02:14:07 ]
>>611
よくわからんが std::reverse でも使っとけ

614 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 02:24:36 ]
世の中にはある程度の割り切りが必要な時だってあるのさ・・・

615 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 22:57:32 ]
>>581
>>582
返信遅くなってしまいました…
そんな単純なミスだったんですね…
ありがとうございました。

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

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

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

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

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

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


621 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 16:00:42 ]
ポインタの先を使用しなけりゃ大丈夫。

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

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

624 名前:618 mailto:sage [2008/04/19(土) 16:18:31 ]
>>623
なるほど。理解しました。
どうもありがとうございました。

625 名前:デフォルトの名無しさん mailto:sage [2008/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 mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 16:55:31 ]
ここで言っているのは、コンストラクタ以外のメンバ関数のことでしょ。
普通、メンバ関数は、コンストラクタによって適切に初期化済みであることを
前提にして書かれているから、
コンストラクタの途中で呼び出すのは、一般的には危険ということ。

628 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 17:18:51 ]
GCC でやってみたら C::C 内でも B::hoge が呼ばれた。未定義なのかな?
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6276.txt

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

630 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 18:04:28 ]
補足。this->nとかの値が不定って意味ね。

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

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

633 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 18:17:17 ]
基底に this は流石に渡さんぜよ。

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

これ使っていないか?

635 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 19:41:56 ]
novtableいいよねー
コード縮むし



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

637 名前:デフォルトの名無しさん mailto:sage [2008/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 mailto:sage [2008/04/19(土) 21:28:41 ]
表現がおかしかったので訂正。

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

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

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

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

641 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 23:25:46 ]
日h(ry

642 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 15:49:31 ]
f( A<int>::B() );

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

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

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

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



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


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

648 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 17:23:34 ]
コンパイラは VC8 SP1 で STL はコンパイラ付属です。

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

650 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 00:38:29 ]
8は2005

651 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 09:47:20 ]
VC++2005Expressではエラーになった

652 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 12:12:58 ]
VC7.1 だとエラーになりました。

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

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


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

654 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 15:34:39 ]
これと同じみたいだね
ttp://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=101842



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

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


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

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

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

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

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

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

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

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

662 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 21:22:36 ]
release / acquire

663 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 22:20:14 ]
>>660
Disconnect / ReConnect とか、Detach / ReAttach とかは?

664 名前:658 mailto:sage [2008/04/24(木) 22:43:04 ]
>>661
Prepare
今回は使いそうに無いけど、ひとつ賢くなりました

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

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

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

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



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

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

668 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 23:54:08 ]
>>667
あぁ納得。
<template <class A>

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

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


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

671 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 02:01:34 ]
だから聞いてるんじゃね

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

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

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

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


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

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



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

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






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<200KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef