■過去ログ置き場に戻る■ 1- 前250 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

C++相談室 part37
501 名前:デフォルトの名無しさん :04/11/17 21:46:58
正直、RTTIつかわなきゃならない程追い込まれた事がない

502 名前:デフォルトの名無しさん :04/11/17 21:53:12
Extension Object, Role Object パターンとかで使ったりもするけど

503 名前:デフォルトの名無しさん :04/11/17 22:14:36
RTTIって言うとdynamic_castも含まれちゃうけど、
typeidに限って言えば俺もほとんど使ったこと無いな。

504 名前:デフォルトの名無しさん :04/11/17 22:20:59
dynamic_castも極力使わない

505 名前:デフォルトの名無しさん :04/11/18 01:29:55
dynamic_castは使ったら負けだと思う
根性無いからしょっちゅう負けてるけど

506 名前:デフォルトの名無しさん :04/11/18 02:45:02
----
struct A
{
  template< typename T > A();
};
struct B : A
{
  B() : A<int>() {}
};
----
↑をコンパイルすると、Bのコンストラクタ内の初期化リストで文法エラーになってしまいます。

テンプレート引数がコンストラクタの引数から推測できないコンストラクタテンプレートは
どうやってテンプレートインスタンスを選択するんでしょうか?

507 名前:デフォルトの名無しさん :04/11/18 03:13:23
>>506
よくわからんが、こんな感じではだめなん?

template <typename T>
struct Type2Type {
 typedef T OriginalType;
};

struct A {
 template <typename T> A(Type2Type<T>) {}
};

struct B : A {
 B() : A(Type2Type<int>()) {}
};


508 名前:デフォルトの名無しさん :04/11/18 03:48:34
>>507
それは
「テンプレート引数がコンストラクタの引数から推測できるコンストラクタテンプレート」
になってるだろ。

509 名前:デフォルトの名無しさん :04/11/18 15:34:59
template <class T>
class C {
    template <class U> friend class C<U>;
};
が VC7.1 でコンパイルしたところ
error C3857: 'C<T1>': 複数テンプレート パラメータ一覧は使用できません。
ってなるんですが、friend には出来ないってことなんですか?
More Effective C++ の auto_ptr に同じコードがあるんですが…

510 名前:デフォルトの名無しさん :04/11/18 16:27:00
new関数をコンストラクタを呼び出さずに呼び出す方法ないですかね?
配列テンプレートを作るときに格納するクラスで定義された
メモリ確保方法を使用したいのですか…


511 名前:デフォルトの名無しさん :04/11/18 16:45:37
>>510
placement new

512 名前:511 :04/11/18 16:46:42
あ。ごめん。逆か。
でもやりたいことをするためには、普通 placement new だと思うんだけど……。

513 名前:デフォルトの名無しさん :04/11/18 16:48:05
>>510
::operator new()

514 名前:デフォルトの名無しさん :04/11/18 17:17:45
>>510
>>513のやり方で領域を確保して、>>511-512のやり方で
インスタンスを生成する。

これにて一件落着。

515 名前:デフォルトの名無しさん :04/11/18 19:13:01
>>506
>テンプレート引数がコンストラクタの引数から推測できないコンストラクタテンプレート
って初めて見たんですがありなんでしょうか? >> All


516 名前:デフォルトの名無しさん :04/11/18 21:32:34
>>509
これg++でもだめですね


517 名前:デフォルトの名無しさん :04/11/19 00:00:39
VC6のサービスパック6を入れようと思ってFULL版をマイクロソフトのサイトからダウンロードしてきたのですが、
setupsp6.exeを起動しても
「16ビット Windows サブシステム
config.nt. システム ファイルは MS-DOS および Microsoft Windows アプリケーションを実行するのに適していません。 アプリケーションを終了するには、[閉じる]を選ん
でください。」
といったダイアログが出てきてインストールできません。ダイアログには「閉じる」と「無視」があるのですが、どちらを
押してもダイアログが閉じるだけです。
どなたか原因が解る方、いませんか?OSは2kです。

Visual Basic 6.0、Visual C++ 6.0、および Visual SourceSafe 6.0d を対象とする Service Pack 6
ttp://www.microsoft.com/downloads/details.aspx?FamilyId=A8494EDB-2E89-4676-A16A-5C5477CB9713&displaylang=ja

518 名前:506 :04/11/19 00:18:11
14.5.2 - Member templates [temp.mem]
-2- より引用。
Note: because the explicit template argument list follows the function template name, and because conversion member function templates and constructor member function templates are called without using a function name,
there is no way to provide an explicit template argument list for these function templates.

「明示的なテンプレート引数を与えることはできない」ということで、
つまり、暗黙の呼び出しのための手がかりが無い以上、
呼び出す方法が無いってことになるのかな。

519 名前:デフォルトの名無しさん :04/11/19 00:34:13
コンパイラから見たらデフォルトコンストラクタが複数あるように見えるだろうし、
どちらにせよそういう使い方はよろしくないな、使用されないダミーのパラメータを持たせるのが良いかと。


520 名前:510 :04/11/19 03:08:05
>>511-514
ありがd

521 名前:510 :04/11/19 04:07:23
>>511-514
うーん。でもこの方法だと、new/deleteが宣言されてない型とか
プリミティブ型のnew/deleteを呼び出したときデフォルトの
new/deleteが呼び出せずコンパイラエラーになってしまいますね(VC.NET2003)
ATLのCArrayとかSTLのvectorでもmallocの類つかってるみたいだし
やっぱ無理なのか…

522 名前:デフォルトの名無しさん :04/11/19 06:09:37
関数への引数として参照を用いた場合
何byteのデータとして渡されてるんでしょうか?
というより「渡される」という解釈ではないのかな?

あと、構造体を作るときのアライメント(4byte刻みとかのやつ)は
関数に渡すときの引数群にも当てはまるのでしょうか?

例:
void Func( char c1, int i, char c2 );
void Func( int i, char c1, char c2 );

微妙な話題ですみません
関数を作るときとか、どういった順序がいいのかよく迷うので
指標になるようなものはないかなぁと思いまして

523 名前:デフォルトの名無しさん :04/11/19 08:43:13
>>522
> 何byteのデータとして渡されてるんでしょうか?

一般的な実装では、ポインタと同じ。

> 関数に渡すときの引数群にも当てはまるのでしょうか?

一般的な実装では、当てはまらない。
順番は呼び出し側コードの読みやすさ、書きやすさで決めれ。

524 名前:デフォルトの名無しさん :04/11/19 09:53:02
>>522
構造体でも4バイトアライメントとは限らない。環境(コンパイラオプションを含む)で変わってしまう。
また、関数の引き数は構造体とは違うので(以下>523

525 名前:デフォルトの名無しさん :04/11/19 10:10:38
>>522
構造体への参照なら一般的な実装ではポインタ渡しになっており
このときの「隠しポインタ」はポインタとしての境界要求を持っていて
メモリ空間が 32bits の処理系では 4bytes 境界が多い

引数の順序に関しては俺はこうしてる
主要なものほど左、ただし同じ系列の関数と統一性を持たせること

デフォルト引数の仕様に不便を感じることがある
void Func(int hour = 0, int min = 0); //という関数に対して
Func(0); //暗黙の min = 0 はできるが
Func(, 0); //暗黙の hour = 0 ができない
こんなときは素直にオーバーロードするがいまいち釈然としないものが残る
void Func(int hour, int min);
inline void Func(int min) { Func(0, min); }

526 名前:デフォルトの名無しさん :04/11/19 10:46:10
>>525
名前付きパラメータですね.もしかしたら次のBoostに入るかも.

Func(0); // min = 0, hour = 0
Func(hour = 1); // min = 0, hour = 1

527 名前:デフォルトの名無しさん :04/11/19 11:05:18
>>525
最初の段、ダウト。境界とメモリ空間には強い関連はない。
メンバの型と並びによって、複雑なふるまいをすることが少なくない。

528 名前:デフォルトの名無しさん :04/11/19 11:42:13
>>527
ああ、空間が 32bits だから境界があるわけじゃないな
これは失礼した、言い直す

境界は空間ではなくバス幅から出てくること
バス幅が1番地あたりのビット数の2倍なら 2bytes 境界、
4倍なら 4bytes 境界の制限が生じる

とは言うものの
バス幅 64bits なのに非特権状態では奇数番地でいいのがあったり
バス幅 8bits なのに 2bytes 境界のがあったりと
憶えたての人を混乱させるシステムが跋扈しているんで
簡潔な説明がしづらい (言い訳くさくてアレだが・・・

529 名前:デフォルトの名無しさん :04/11/19 12:54:01
>>528
素直に、環境依存だから当てにするなって言えばいいじゃん。
実際、sparc compilerなんかだとメンバに一つでもdoubleが入ると8バイト境界になるけど
charしかなければ1バイト境界だし。

530 名前:デフォルトの名無しさん :04/11/19 13:09:01
>>529
いや判断材料は持ってないとSF的な妄想で書くわけにもいくまい
522 が訊きたかったのはそのあたりじゃないか

当てにするなというよりマニュアルとアセンブラで確認しろってとこだが
仮にそう言ったとして今現在の 522 にとってどうなのかな

531 名前:デフォルトの名無しさん :04/11/19 13:40:15
>>526
Boost?

532 名前:デフォルトの名無しさん :04/11/19 13:43:54
int hour;
int min;

void Func(...);

とかじゃねえだろなw

533 名前:デフォルトの名無しさん :04/11/19 13:50:58
T* p = new T;
T* p = new T();
の両方見るんですが、差異はあるのでしょうか…?

534 名前:デフォルトの名無しさん :04/11/19 13:58:05
>>533
T が POD の場合、前者は中身が初期化されない。
後者はあたかも = {0} したかのように初期化される。

535 名前:デフォルトの名無しさん :04/11/19 14:23:50
>>534
ありがとうございます

POD っていうのは
ユーザー定義コンストラクタ、デストラクタ、コピー演算子がない
かつ private, protected に非staticデータメンバがなく、
基底クラスも仮想関数も持たないクラスという理解でいいでしょうか…?

536 名前:デフォルトの名無しさん :04/11/19 14:26:43
p->int::~int();

537 名前:デフォルトの名無しさん :04/11/19 15:01:44
template <class To, class From>
inline To implicit_cast(From from)
{ return from; }
と static_cast はどのように使い分けたらいいのでしょうか?

あと implicit_cast の引数は const From& from で渡した方が
効率がいいように思うのですが、これでは何か問題があるのでしょうか?

538 名前:デフォルトの名無しさん :04/11/19 15:06:04
>>537
ttp://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpdndeepc/htm/deep05182000.asp

539 名前:デフォルトの名無しさん :04/11/19 15:26:07
>私としては、C++ の委員会が reintepret_cast と static_cast とを相互排他的な
>動作セットに分類してくれていたらと思います。これら 2 つの演算子の動作が
>重複しなければ、プログラマもそれぞれの演算子を使うべき場面を判断しやすかった
>でしょう。
ハゲドウだな。

540 名前:デフォルトの名無しさん :04/11/19 15:48:12
俺は別に迷ったこと無いけどな・・・。


541 名前:デフォルトの名無しさん :04/11/19 15:50:31
>しかし、たとえ必要のない場合でも、このようにすべての型変換を
>明示的な形にすることにはメリットがあります。

全ての暗黙の型変換を implicit_cast でやるのはマンドクサイ気がするんだが、
これ読む限りやったほうがいいのかな?

542 名前:デフォルトの名無しさん :04/11/19 15:53:03
implicitっていう名前がこれまた最悪だ

543 名前:デフォルトの名無しさん :04/11/19 16:30:59
>>541
コンパイラの警告をつぶすためには有効じゃないかな。
情報喪失の警告は重要な情報だが常に出るのはうざいので、
implicit_cast でマーキングした上でコンパイラさんには黙ってもらう。
grep すれば後から見つけ出せる。
間違ってもコンパイラオプションで黙らせるようなことはしちゃいけない。

544 名前:デフォルトの名無しさん :04/11/19 16:51:27
>>543
long lg = 0;
short st = 0;
st = implicit_cast<short>(lg);

VC7.1 では
warning C4244: 'return' : 'long' から 'short' に変換しました。データが失われているかもしれません
ってなるんだけどどういうこと??

545 名前:デフォルトの名無しさん :04/11/19 16:58:55
implicit_castの中で出てるんでしょ?
そこだけ警告切りなよ。そのために関数にしてるんだから。

546 名前:デフォルトの名無しさん :04/11/19 17:34:26
暗黙の型変換を全てimplicit_castで書いてる香具師なんているのかね

547 名前:デフォルトの名無しさん :04/11/19 19:53:03
>>544
BOOLからboolの変換でうるさいから、
BOOL foo = TRUE;
bool bar = !!foo;
してますがなにか。

548 名前:デフォルトの名無しさん :04/11/19 20:03:22
bool bar = foo ? true : false;でいいんじゃないか。

549 名前:デフォルトの名無しさん :04/11/19 20:15:08
bool bar = ( foo != 0 );
俺はこれ。

550 名前:デフォルトの名無しさん :04/11/19 20:15:47
!Ruby

551 名前:デフォルトの名無しさん :04/11/19 20:55:01
スコープ解決演算子でエラーが起こる(VC7.1,GCC3.4.3)のですが、
どうすべきなのでしょうか?
error C2510: 'type' : スコープ解決演算子 '::' の左側の識別子名は、クラス、構造体、共用体のいずれでもありません。

namespace Name
{
struct a
{
typedef int type;
static const int data;
};
}

//const int ::Name::a::data = 100; //OK
//const ::Name::a::type Name::a::data = 100; //OK
//const Name::a::type ::Name::a::data = 100; //NG
//const ::Name::a::type ::Name::a::data = 100;//NG

552 名前:デフォルトの名無しさん :04/11/19 20:59:12
新しい演算子を定義できないから嫌い。

553 名前:デフォルトの名無しさん :04/11/19 21:18:12
それが関数でありクラスであり・・・
無数の空間を与えられながらそれを否定して
ある特定の文字列に固執する者は遠目に何に見えると思うかね

554 名前:551 :04/11/19 21:21:19
>>552
どーも
type ::var を type var に変形したら通りました
template <typename T> struct identity
{
typedef T type;
};
const Name::a::type identity<::Name::a>::type::data = 100; //OK
const ::Name::a::type identity<::Name::a>::type::data = 100; //OK


555 名前:デフォルトの名無しさん :04/11/19 22:43:08
551にレスしたわけじゃないよ

556 名前:デフォルトの名無しさん :04/11/20 03:45:21
>>550
//const Name::a::type ::Name::a::data = 100;
これは
const Name::a::type::Name::a::data = 100;
ということなので、NGで当たり前。
const Name::a::type (::Name::a::data) = 100;
とすればいい。

557 名前:デフォルトの名無しさん :04/11/20 09:05:34
おはようございます。
ファイル入出力やディレクトリ操作から始まって
ソケットプログラミングまで扱うような、
C++の用例の載っているおすすめの参考書がありましたら教えて頂けませんか?
趣味でプログラムの勉強をしてまして、
UNIXの基本コマンドを練習用に自分で書いてみたいんです。

558 名前:デフォルトの名無しさん :04/11/20 10:07:40
allocaを使いたいのですが、いろいろ調べてみるとallocaは、
プラットフォーム依存になってしまうなど、あまり使うのを推奨されていないようで、
allocaの代わりになるようなものは、ないでしょうか?
以下のコードのように、呼び出し先で明示的に確保されたメモリを
解放しなくても良い方法を知りたいのです。宜しくお願いいたします。

char* ReturnChar(void)
{
char* pRet = new char[5];
strcpy(pRet, "test");
return pRet;
}

int main(void)
{
char* pTest = ReturnChar();

// ここで、delete[] pTest; をしなくても解放されるようにしたい

return 0;
}

559 名前:デフォルトの名無しさん :04/11/20 10:09:06
>>558
boost::shared_array

560 名前:デフォルトの名無しさん :04/11/20 10:21:50
>>558
オマエの例では、allocaはもともと使用できないぞ。

561 名前:デフォルトの名無しさん :04/11/20 11:23:33
>>558
>>559またはstd::auto_ptr

562 名前:デフォルトの名無しさん :04/11/20 12:14:14
あの例だと、これが最適じゃないか?

void GetChar(std::string &ret){
ret="test";
}

main(){
std::string test;
Char(ret);
}

563 名前:デフォルトの名無しさん :04/11/20 12:45:51
sharted_arrayかstringで受け渡ししる

const std::string GetChar()
{
reutrn "test";
}
int main(void)
{
std::string str = GetChar();
return 0;
}


564 名前:デフォルトの名無しさん :04/11/20 13:42:02
>>557です。スレ違いですよね。別のスレで改めて質問しようと思います。

565 名前:デフォルトの名無しさん :04/11/20 13:44:43
>>564
あるよ。
UNIXネットワークプログラミング入門

566 名前:デフォルトの名無しさん :04/11/20 14:09:21
>>561
new[]で確保したものにauto_ptrはよろしくないかと。

567 名前:561 :04/11/20 14:12:38
申し訳ない

568 名前:デフォルトの名無しさん :04/11/20 14:53:30
どっちかっつーと対応するのはscoped_arrayだと思うが。
allocaの代わりって事は他とshareしないんだろ?

569 名前:デフォルトの名無しさん :04/11/20 16:47:51
boost1.32.0キタ━━━━(゚∀゚)━━━━!!

570 名前:デフォルトの名無しさん :04/11/20 17:37:39
>>569
boostスレから脱獄しないように

571 名前:デフォルトの名無しさん :04/11/20 17:41:34
>>556
納得したいけどなんか腑に落ちないな

572 名前:デフォルトの名無しさん :04/11/20 17:43:02
Name::a::type const ::Name::a::data = 100;


573 名前:デフォルトの名無しさん :04/11/20 20:31:13
>>572
typedef char* type;
ポインタだと違う型になってしまう悪寒。



574 名前:558 :04/11/20 23:01:50
御解答ありがとうございます。
>>559>>562>>563>>568
で検討して見ます。
できれば、allocaの代わりになるものでANSI準拠のものが良かったのですけど。
ちなみに、boostってライセンスってどうなんですか?
改変、商用OKであれば、嬉しいです。

575 名前:デフォルトの名無しさん :04/11/21 00:02:00
>>574
OKだったはず。バイナリ配布なら特に明記もいらないんじゃなかったっけか

576 名前:デフォルトの名無しさん :04/11/21 00:42:46
>>574
ttp://www.tietew.jp/cppll/archive/5773

577 名前:デフォルトの名無しさん :04/11/21 01:34:34
>>573
ちがいはありません

578 名前:デフォルトの名無しさん :04/11/21 03:20:04
>>577
通報シマスタ

579 名前:デフォルトの名無しさん :04/11/21 10:05:27
#define UNICODE
#define _UNICODE
#include <iostream>
int main()
{
 std::wcout.imbue(std::locale("japanese"));
 std::wcout << L'A' << std::endl;
 return 0;
}
実行結果: 65
Aって表示して欲しいのに数字で表示されちゃいます。
vc7.1 STLport-4.6.1です。



580 名前:デフォルトの名無しさん :04/11/21 10:19:27
"A"

581 名前:デフォルトの名無しさん :04/11/21 10:35:57
std::wcout.put(L'A') << std::endl;

582 名前:デフォルトの名無しさん :04/11/21 10:40:37
std::wcout.put(L゚∀゚) << std::endl;


583 名前:デフォルトの名無しさん :04/11/21 10:55:27
>>582 さんの様に入力するとコンパイルエラーがでます。

584 名前:デフォルトの名無しさん :04/11/21 11:17:45
そりゃそうだ

585 名前:デフォルトの名無しさん :04/11/21 11:35:51
なんで殆どの方はVC7.1にもstlport適用するかな(プンプン

586 名前:デフォルトの名無しさん :04/11/21 12:25:15
漏れ適用してないよ。

587 名前:デフォルトの名無しさん :04/11/21 13:27:22
>>581 >>582
ハゲワラ

588 名前:579 :04/11/21 13:33:30
coutだとcout<<'A'<<endlでちゃんと表示されるのに...。 仕様ですか?

ほかの人のソースを見るとlocale::global(locale("japanese"))で、できてるのですが
stlportだとstd::wcout.imbue(std::locale("japanese"));ってしなきゃならないのらしいのですが
これはstlportが単独でわるいのですか?585さんが言うようにvc7.1とあわさると悪くなるのですか

589 名前:デフォルトの名無しさん :04/11/21 14:41:07
x=new double*[X];
for (int i=0;i<X;i++)
{
    x[i] = new double[Y];
}
で2次元配列を確保しているのですが、これをメモリ上で連続した領域に確保するにはどうしたらよいでしょうか?


590 名前:デフォルトの名無しさん :04/11/21 14:44:49
x=new double*[X];
x[0] = new double[X*Y];
for (int i=1; i<X; i++) x[i] = x[0]+i*X;

とか

591 名前:デフォルトの名無しさん :04/11/21 18:25:50
>>588
VC++ではデフォルトでwchar_tはshortのtypedefだから
君が文字を突っ込んだつもりでも、向こうは数字が来たと思ってる。
さらにSTLPortはこのデフォルトの設定を使ってコンパイルしてるから
単にVC++の設定を変えるだけだとリンクエラー出る。
STLPortのmakeファイルをいじって再コンパイルが必要。

592 名前:デフォルトの名無しさん :04/11/21 18:33:37
STLPort使えねー

593 名前:デフォルトの名無しさん :04/11/21 18:46:53
VC7.1でSTLPort使うメリットあるのかね?

594 名前:デフォルトの名無しさん :04/11/21 19:33:42
かなり初歩的な質問だと思うのですが,C で普通に行える

void *a = 1;
a += 5;

のような事を C++ 内で行うと gcc に
「error: `void *' 型のポインタが計算で使われました」
と怒られてしまいます.これを回避するにはどうすれば良いのでしょうか.

ポインタだけでも教えて頂けると助かります.

; 現状は char* にキャストして回避してます...

595 名前:デフォルトの名無しさん :04/11/21 19:37:40
>>かなり初歩的な質問だと思うのですが,C で普通に行える
嘘をつくな

596 名前:デフォルトの名無しさん :04/11/21 19:39:44
void* には減算、加算はなくて ==, != しか無い。
どんなクソプログラム書いてるのか知らんが一から考え直せ。

597 名前:594 :04/11/21 19:51:56

>> 594
C のコードではエラー出てなかったんで,てっきり使えると思ってました.

>> 596
mmap したものに memcpy でデータを順次書き込んでいくコードなんですが,
書き込み位置をずらすために,

void *p = mmap(...);
mempcy(p, hoge, size);
p += size; // ← ここ

のような事がしたいんですが,普通はどうやるんでしょうか?

598 名前:デフォルトの名無しさん :04/11/21 19:58:08
char*でええやん

599 名前:デフォルトの名無しさん :04/11/21 20:06:00
いや BYTE* を使うべきだろ。

600 名前:デフォルトの名無しさん :04/11/21 20:43:07
>>597
>C のコードではエラー出てなかったんで,てっきり使えると思ってました.

gcc には非標準拡張がてんこ盛り入ってる
他がそんなに綺麗なわけでもないが・・・

あんまり1つの処理系での「常識」を信じすぎるな、という教訓を得たならめでたいことだ

601 名前:デフォルトの名無しさん :04/11/21 20:51:34
おめでとう

602 名前:594 :04/11/21 20:54:40

みなさん,ありがとうございます.勉強になりました.

603 名前:デフォルトの名無しさん :04/11/21 21:12:57
じつにめでたいな

604 名前:デフォルトの名無しさん :04/11/21 21:20:54
めでたいっつーか、おめでたいな。

605 名前:デフォルトの名無しさん :04/11/21 22:08:48
今日は赤飯だ


606 名前:デフォルトの名無しさん :04/11/21 22:15:50
10歳違いの妹が初整理をつい最近迎えました

607 名前:デフォルトの名無しさん :04/11/21 22:50:50
おめでとう


608 名前:デフォルトの名無しさん :04/11/21 22:55:34
VC7.1でSTLportを使うと、必ずマルチスレッドのモジュールをリンクしないと
エラーが出るので(STLportはスレッドセーフレベル2)、気をつけなければいけ
ないとすればその点かな。

速度的には・・・・どうなんでしょう?アルゴリズムは結構速いという定評ですが。
http://www.nantekotta.com/stl.html
↑これはVC6.0付属のDinkumwareとの比較なのであまり参考にならないが。

609 名前:デフォルトの名無しさん :04/11/21 22:56:42
スレッドセーフレベルって何?

610 名前:デフォルトの名無しさん :04/11/21 22:58:25
>>609
safe level でぐぐってみ。

611 名前:デフォルトの名無しさん :04/11/21 22:59:55
>>609
http://japan.linux.com/print.pl?sid=03/05/19/1241240

612 名前:デフォルトの名無しさん :04/11/21 23:00:29
ぐぐってみたけどrubyの方言か?

613 名前:デフォルトの名無しさん :04/11/21 23:01:13
>>611
そりゃRubyだろ。スレ違い。

614 名前:デフォルトの名無しさん :04/11/21 23:01:52
C++よりRubyの方が先進的。
禿も最近はRubyがお気に入りだってさ。

615 名前:デフォルトの名無しさん :04/11/21 23:02:54
STLPortはrubyで出来ていたのか(w

616 名前:デフォルトの名無しさん :04/11/21 23:04:03
C++には将来がない。
Rubyには未来がある。

617 名前:デフォルトの名無しさん :04/11/21 23:05:26
セーフ・レベルがあるのかどうかは知らんが、STLportは例外セーフおよび
スレッドセーフである事は確か。オプションでコントロールできるが。
_REENTRANTマクロだっけ。

618 名前:デフォルトの名無しさん :04/11/21 23:06:44
_MTマクロだろ

619 名前:デフォルトの名無しさん :04/11/21 23:38:59
class Vector { // 基底クラス(ベ−スクラスとも言う)
int x,y ; // 座標値のみをもっているクラス
public:
Vector( int a,int b ) { x = a ; y = b ; }
int get_x() { return x ; }
} ;

class Point: public Vector { // 派生クラス(導出クラスとも言う)
int color ;
public: // デフォルトの色は9
Point( int a,int b,int cc=9 ):Vector( a,b ) { color = cc ; }
int get_color() { return color ; }
} ;

Pointコンストラクタの後ろについている「:」がよくわかりません。
PointクラスがVectorクラスを継承しているのは分かるのですが・・・・・・

620 名前:デフォルトの名無しさん :04/11/21 23:44:58
よく本嫁

621 名前:デフォルトの名無しさん :04/11/21 23:55:06
>>619
初期化リスト。格好としては基底クラスのコンストラクタを呼び出している
ような感じになっている。

622 名前:デフォルトの名無しさん :04/11/22 00:07:38
低レベルな質問にも親切に答えて下さってありがとうございます。


623 名前:デフォルトの名無しさん :04/11/22 00:16:46
STLPortはロケール関係でメモリリークが検出されるのが気に入らない。

624 名前:デフォルトの名無しさん :04/11/22 00:17:53
なら使わなきゃイイじゃん

625 名前:デフォルトの名無しさん :04/11/22 00:33:10
使ってないけど、直してくれれば使いたい。

626 名前:デフォルトの名無しさん :04/11/22 01:49:05
自分で直せば?

627 名前:デフォルトの名無しさん :04/11/22 01:53:17
直してまで使いたいとは思わない。

628 名前:デフォルトの名無しさん :04/11/22 01:59:31
文句を言うだけでお客様然とする奴等はRubyを使う資格無し。

629 名前:デフォルトの名無しさん :04/11/22 02:21:36
ostream で、80行とかで改行してくれるような物を作ろうとしています。とこ
ろが、ostream を派生させたクラスを作ってput,writeをオーバーライドして、
書き込み文字数をカウントして、改行を付加しながら出力すれば簡単に出来る
かなと思いきや、 putもwriteもvirtualじゃないので、 ostream::operator<<
で入力した物は派生クラスのput,writeを呼んでくれなくあえなく断念。かと
言って、他のPODに対してのoperator<<を軒並オーバーライドするのも馬鹿っ
ぽいし、何か良い知恵があったら教えて頂けませんでしょうか。
書式制御なので、出来ればstreambufをいじるんじゃない方向がいいんですよね。

イメージとしては、
custom_stream stream(5)
stream << "test" << 200 << 0.05 << "test";
で、
test2
000.0
5test
のようになるようなストリームクラスを作りたいのです。

630 名前:デフォルトの名無しさん :04/11/22 02:23:37
stringstreamに一度出力して整形しながらもう一度
出力しなおすのが楽なんじゃないか?

631 名前:デフォルトの名無しさん :04/11/22 08:14:40
>>623
#ifdef _DEBUG
#define _STLP_DEBUG 1
#define _STLP_USE_NEWALLOC 1
#else
#undef _STLP_DEBUG
#endif

こんな事をしとけばいい

632 名前:デフォルトの名無しさん :04/11/22 09:06:54


633 名前:デフォルトの名無しさん :04/11/22 15:31:04
age荒らし厨ウゼー

634 名前:C++ 初心者 :04/11/22 20:12:49
こんなことがしたいんですけど、
コンパイル エラーが出るんです。
どういう風に修正したらいいでしょうか?

class Record { ... };
typedef Record* RecordPtr;
typedef const Record* ConstRecordPtr;

class Hoge {
private:
  vector<RecordPtr> _records;
public:
  const vector<ConstRecordPtr>& GetRecords(void) const
  {
    return _records;
  }

};

635 名前:デフォルトの名無しさん :04/11/22 20:18:50
use "template"

636 名前:デフォルトの名無しさん :04/11/22 20:20:01
って違うな。何がやりたいのかと、エラー個所かけ

637 名前:デフォルトの名無しさん :04/11/22 20:22:49
>>634
vector<ConstRecordPtr> GetRecords(void) const
{
vector<ConstRecordPtr> result;
result.reserve (_records.size ());
copy (_records.begin (), _records.end (), back_insert_iterator <vector<ConstRecordPtr> > (result));
return result;
}


638 名前:634 :04/11/22 20:22:57
return _records でエラーです。

E:\Project\Test67\Main.cpp(18) : error C2440: 'return' : 'const class std::vector<class Record *,class std::allocator<class Record *> >' から
'const class std::vector<class Record const *,class std::allocator<class Record const *> > &' に変換することはできません。(新しい動作 ; ヘルプを参照)

理由: 'const class std::vector<class Record *,class std::allocator<class Record *> >' から
'const class std::vector<class Record const *,class std::allocator<class Record const *> >' へは変換できません。

コンストラクタはソース型を持てません、またはコンストラクタのオーバーロード レゾリューションがあいまいです。


639 名前:634 :04/11/22 20:24:10
>>637
あのー、戻り値は & なので、ローカルの result を返したらあかんでしょう。。。

640 名前:634 :04/11/22 20:24:57
あ、戻り値の & をとったわけか。
いや、そんな重いことはしたくないですぅ。。。

641 名前:634 :04/11/22 20:27:28
何がやりたいのか、といいますと、
RecordPtr のベクタを、ConstRecordPtr のベクタとして返したいわけです。
もちろん、コピーなどの操作は一切行わずに、単純な型変換だけ行ってです。

642 名前:デフォルトの名無しさん :04/11/22 20:28:38
>>640
じゃresultに相当するのをmemberにもって慎重に操作したら?
だいたいその手の最適化は最後にプロファイルしてからだ


643 名前:デフォルトの名無しさん :04/11/22 20:30:50
>>640
vector<ConstRecordPtr> GetRecords(void) const
{
return vector<ConstRecordPtr> (_records.begin (), _records.end ());
}
こっちがいいかも


644 名前:634 :04/11/22 20:37:54
>>642
> だいたいその手の最適化は最後にプロファイルしてからだ
いえ、レコードが大量にあることがあらかじめ分かっているので、
コーディング時にその最適化は終わらしておきたいんです。

>>643
やっぱりコピーしなあかんですか。。。
C++ ってこういうものなんでしょうか。。。

645 名前:634 :04/11/22 20:43:36
やっぱり奥の手を使うしかないのかなぁ。。。
こんなんで。

vector<ConstRecordPtr>& GetRecords(void) const
{
  return * (vector<ConstRecordPtr> *) (void *) (& _records);
}


646 名前:デフォルトの名無しさん :04/11/22 20:44:04
うっさいなぁ。これでいけ。

const vector<ConstRecordPtr> &GetRecords() const{
return (const vector<ConstRecordPtr> &)_records;
}

647 名前:デフォルトの名無しさん :04/11/22 20:45:15
>>634
こういうキャストで済む問題じゃないよな。
return *reinterpret_cast<vector<ConstRecordPtr>*>(&_records);

648 名前:デフォルトの名無しさん :04/11/22 20:45:56
ていうか、ただvectorの内容を参照したいだけなら
const_iteratorを返せばいいんじゃないの?

649 名前:634 :04/11/22 20:46:20
>>646
あ!そんなんでいけるんですね。
ありがとう!感謝感謝

650 名前:デフォルトの名無しさん :04/11/22 20:54:51
>>648
イテレータ返すのって、作法としていいのかな。
vector<..>::const_iterator GetRecordsBegin()
vector<..>::const_iterator GetRecordsEnd()
みたいに2つも用意しないといけないでしょう。

651 名前:デフォルトの名無しさん :04/11/22 20:59:19
>>650
std::pair<std::vector<hoge>::const_iterator, std::vector<hoge>::const_iterator>を返せば良い。

652 名前:デフォルトの名無しさん :04/11/22 21:02:27
うわー、それを呼び出すときって、大変じゃない?
pair 変数と const_iterator 2 つを用意して、
pair 変数で受け取って、second と first をとって別の変数に代入して。。。
Python のタプルのようなものがあれば楽だけど。

653 名前:デフォルトの名無しさん :04/11/22 21:07:11
>>650
おいおい <algorithm> の関数の大半を否定するかよ・・・

654 名前:デフォルトの名無しさん :04/11/22 21:08:12
少なくとも記法という観点からは否定したいねぇ。
map とか pair を多用するけど、便利なことは便利だが。

655 名前:デフォルトの名無しさん :04/11/22 21:09:07
続きを検索なんてどうやっとん

656 名前:デフォルトの名無しさん :04/11/22 21:09:58
イテレータによるコンテナの抽象化って、
正直いってあまり使わないんだよねー。
設計の段階でどのコンテナを使うべきかだいたい決まってしまうし。

657 名前:デフォルトの名無しさん :04/11/22 21:10:28
>>655 どういうこと?


658 名前:デフォルトの名無しさん :04/11/22 21:15:22
>>657
例えばパーサ作ってるときの区切り文字とか

659 名前:デフォルトの名無しさん :04/11/22 21:18:49
それはお前がalgorithmを使いこなしてないだけ

660 名前:デフォルトの名無しさん :04/11/22 21:19:42
それはイテレータみたいの使うねぇ。

661 名前:デフォルトの名無しさん :04/11/22 21:25:41
650: イテレータ返すのって、作法としていいのかな。
653: おいおい、<algorithm> の関数の大半を否定するかよ・・・
654: 少なくとも記法という観点からは否定したいねぇ。
655: 続きを検索なんてどうやっとん
657: どういうこと?
658: 例えばパーサ作ってるときの区切り文字とか
659: ??? ←ここだけ流れが読めない
660: それはイテレータみたいの使うねえ。

「みたいの」って似て非なるものってこと?

662 名前:デフォルトの名無しさん :04/11/22 21:27:36
C++厨って馬鹿ばっかり。

663 名前:662 :04/11/22 21:28:30
やっぱりRuby最高!

664 名前:660 != 659 :04/11/22 21:28:47
いや、抽象的な意味でのイテレータなら使う。
それが必ずしも STL の設計を踏襲したものにするとは限らないということ。

ポインタも抽象的な意味でのイテレータだし、
FILE* を fseek() するのも FILE* をイテレータとみなしているということだよね。

665 名前:デフォルトの名無しさん :04/11/22 21:34:28
>>664
もしかしてenumeratorと間違ってない?

666 名前:デフォルトの名無しさん :04/11/22 21:34:34
いや、FILE*はオブジェクト指向だろ。

667 名前:デフォルトの名無しさん :04/11/22 21:35:20
for(int i = 0; i < N; i++){ ; }

これも、「イテレータみたいなもの」と言えるかしら

668 名前:660 :04/11/22 21:36:10
>>665
どう違うの?教えて君。

669 名前:660 :04/11/22 21:36:45
>>667
「これ」って何を指しているの?

670 名前:デフォルトの名無しさん :04/11/22 21:37:21
Ruby!

671 名前:デフォルトの名無しさん :04/11/22 21:39:58
>>664
そう、抽象的な意味でのイテレータだよな。
650の主張によれば始点と終点を別個に返す必要が出るらしいが、
仮に添え字で返したにしてもそれは同じことで、
本質的にシーケンス上の位置を示すものを返すことを
作法という観点からどのように否定するのか疑問に思ったわけさ。
仮に可読性と言うなら確かに STL の設計とは思想を異にする主張だな。
ある意味、template 引数が自動的な typedef になってくれることを使うか捨てるかで。

ところで、FILE* はファイル上の位置を示してないだろ。
これ、どうする?
FILE *fp1, *fp2;
fp1 = fopen("hoge", "r");
fp2 = fopen("hoge", "r");
fseek(fp2, 1, SEEK_CUR);
俺的には fseek の第2引数がイテレータで、第3引数が第2引数の型って気がするが・・・

672 名前:デフォルトの名無しさん :04/11/22 21:40:25
>>667
p[i]などとして使っていれば、「イテレータみたいなもの」と言えなくもない。

673 名前:デフォルトの名無しさん :04/11/22 21:42:05
イテレータは「繰り返すもの、反復するもの」だから
本義的にはポインタはイテレータではない。
だがC++のイテレータはポインタを含むように設計された
(つまり繰り返し処理のために++演算子を使うことにした)
からポインタはSTL内に限ってイテレータの一種になったに過ぎない。

674 名前:デフォルトの名無しさん :04/11/22 21:44:47
>>673
ptr++

675 名前:デフォルトの名無しさん :04/11/22 21:53:15
>>671
イテレータ自体が始点と終点を知っていれば何の問題も無いのでは?
JavaやC#ではわざわざendを返したりしない。

676 名前:デフォルトの名無しさん :04/11/22 21:57:06
>>675 そう、それいいね。

677 名前:デフォルトの名無しさん :04/11/22 21:57:42
>>675
終端標識を使ったから頭だけで済んだってのはナシだろ、
それだったらイテレータだって同じことじゃん。

678 名前:デフォルトの名無しさん :04/11/22 22:47:36
FILE * はオブジェクト
シークポインタがイテレータ

679 名前:デフォルトの名無しさん :04/11/22 22:49:23
>>675
Javaのイテレータは不自然だから嫌い


680 名前:デフォルトの名無しさん :04/11/22 23:01:39
>634
boost::rangeとかどうですか?
http://www.boost.org/libs/range/index.html

>652
boost::tuples::tieとかどうですか?
http://boost.cppll.jp/HEAD/libs/tuple/doc/tuple_users_guide.html#tiers

681 名前:デフォルトの名無しさん :04/11/23 06:10:24
for (int i (0); i < 10; ++ i) // <- (A)
for (int i (0); i < 10; ++ i) // <- (B)
cout << i << endl; // <- (C)

これってg++ではコンパイル出来るんですけどいいんでしたっけ?
(B)の行で(A)のiとコンフリクトするとかエラーが出るのが
本来の仕様だったりしないか不安なのですが


682 名前:681 :04/11/23 06:16:01
あとこっちも
for (int i (0); i < 10; ++ i) // <- (A)
{
int i (0); // <- (B)
cout << i << endl; // <- (C)
}


683 名前:デフォルトの名無しさん :04/11/23 06:26:22
クラス全体で使うコンスタントをクラス内で定義するにはどうしたらよいのでしょうか?

class A{
    const int x=10;//<-できない
};
A::A()
{
    const int x=10;//<-ここでしか有効でない
}




684 名前:デフォルトの名無しさん :04/11/23 06:36:00
>>683
class A{
static const int x=10;
};

class A{
const int x;
};
A::A(): x (10)
{
}


685 名前:デフォルトの名無しさん :04/11/23 06:38:30
>>683
初期化リストを使うとか。A::A() : x(10) { ... };

686 名前:デフォルトの名無しさん :04/11/23 06:40:55
>>684
staticをつければいいんですか。ありがとうございました。

687 名前:デフォルトの名無しさん :04/11/23 10:59:15
質問お願いするっす、以下のこれは保証されているんでしょうか

std::map<int, int> map_weight;
map_weight[ 777 ] += 100; //いきなり
printf( "val = %d\n", map_weight[ 777 ] ); //val = 100

intの初期化は、いわゆる組込型のint()に必ずなっているんでしょうか

688 名前:687 :04/11/23 11:00:25
自己解決しました。もういいよ

689 名前:デフォルトの名無しさん :04/11/23 11:10:17
>>688は騙りです
単発質問にトリップがいるのか

690 名前:トリップ ◆hEpdoZ.tHU :04/11/23 11:28:28
>>689
呼んだ?

691 名前:687 :04/11/23 11:50:23
>>689
どういう意味でしょうか?
自己解決したので質問に答えなくてもいい、
というのは必要はないってことですか?

692 名前:デフォルトの名無しさん :04/11/23 11:56:28
>>691
俺は 689 ではないが・・・
別に放置でも構わなかったが
自己解決したことを律儀に連絡してくれたところまでは礼儀正しい印象だよ
最後の「もういいよ」が投げやりな印象を与えていて
キレやすい人に引火しかねないのが玉に瑕

693 名前:デフォルトの名無しさん :04/11/23 12:09:33
>>687
ISO/IEC 14882-1998
23.3.1.2 map element access

T& operator[](const key_type& x);

Returns: (*((insert(make_pair(x, T()))).first)).second
                   ~~~~
保証されている

694 名前:デフォルトの名無しさん :04/11/23 12:16:00
>>693
ありがとうございましす。助かりました。
というかそうか…出来る人はISO C++ 規格できっちり調べるのか。
回答内容以上に頭が下がる思いです。今後の指針にします。

695 名前:デフォルトの名無しさん :04/11/23 12:17:59
と失礼しました
s/ましす/ます

696 名前:デフォルトの名無しさん :04/11/23 12:27:04
クラスの静的メンバに構造体がある場合、うまく初期化できなくって困っているのですが・・・
たとえばヘッダに
class a
{
static D3DXVECTOR3 m_vPosi;
static int PosiX;
{
と定義していた場合、cppファイルの先頭の辺りで
D3DXVECTOR3 a::m_vPosi.x = 5.0f;
などとするとコンパイルエラーとなるのです。
int a::m_iPosiX = 5;
などは通るのですが・・・・。まとめて
D3DXVECTOR3 a::m_vPosi = {5.0f,5.0f,5.0f};
などとするしかないのでしょうか?

697 名前:モウモウ :04/11/23 12:30:46
.x だけ初期化したいんなら、
D3DXVECTOR3 a::m_vPosi = { 5.0f };
でいけるはず。

698 名前:デフォルトの名無しさん :04/11/23 13:33:50
>>694
当たり前だ。無駄な議論を避けるためにドラフトを読むのは常識。
そうでないとまた知ったか厨が余計な口出しをし出してスレが荒れるからな。

699 名前:デフォルトの名無しさん :04/11/23 13:35:46
>>698
ググって探せばないこともないけど、
正式に読もうとすると有料っていうのはちょっとね…

700 名前:デフォルトの名無しさん :04/11/23 13:46:32
>>697
ありがとうございます。
では、yだけ初期化したいときは?

701 名前:デフォルトの名無しさん :04/11/23 13:46:41
>>699
一個古い規格だけど最低ここは読もうよ。テンプレにもあるけど。
http://www.kuzbass.ru/docs/isocpp/

702 名前:681 :04/11/23 14:37:28
すみません
681と682は他の環境ではエラーでないでしょうか?


703 名前:デフォルトの名無しさん :04/11/23 14:45:40
>>702
内側の i が外側の i を隠蔽するだけで、文法的には何ら間違いはない。

704 名前:デフォルトの名無しさん :04/11/23 14:46:51
ちなみにVC7.1では681も682もノーエラーで、内側の i の値が表示される。

705 名前:デフォルトの名無しさん :04/11/23 14:47:58
あんまり難しく考えるな。頭禿げるぞ。

706 名前:デフォルトの名無しさん :04/11/23 14:55:52
>>705
禿じゃないとC++の設計はできないらしいよ

707 名前:デフォルトの名無しさん :04/11/23 14:56:23
よくわかったな。もうハゲてます。

708 名前:681 :04/11/23 15:07:20
>>705
最近ちょっと上達の兆しがあります
家系的に私はBjarneを超えるはずです

みなさんどうもありがとう


709 名前:デフォルトの名無しさん :04/11/23 15:08:37
>>708
> 家系的に私はBjarneを超えるはずです
ここに激しく同情しますな

#おれもな〜


710 名前:デフォルトの名無しさん :04/11/23 15:22:47
確かにobsoleteなC++だとfor文で定義した変数はfor文を終了しても
生き続けるから>>681は問題があるかもしれないが、VC6が今手元に
ないので実験できない。

gccなら古いC++にするオプションがあったかもしれないが覚えてない。

711 名前:デフォルトの名無しさん :04/11/23 15:24:10
>>710
-fno-for-scope

712 名前:デフォルトの名無しさん :04/11/23 15:34:52
>>711
dクス。-fno-for-scopeと-ffor-scopeの両方でgcc3.4.2('MinGW)で試してみたが
出力結果には差がありませんでした。

但しforループを完全に抜けた後で
 std::cout << i << std::endl;
の一行を付け加えると、-fno-for-scopeは古いC++の動作通り 10 が出力され
ました。-ffor-scopeでは当然ですがコンパイルエラーになりました。

713 名前:デフォルトの名無しさん :04/11/23 16:29:25
課題
『標準入力からテキストファイルを読み込み、行を短い順に出力しなさい。
但し、行は最大 80 文字とし、 80 文字以上の行は先頭 80 文字だけの行として取扱い出力し、
空行は出力しないで下さい。
また、同じ長さの行は入力した順番に出しなさい。
レポートでは、実行例として、作成したソースプログラムをプログラムに入力した出力と、
http://www.bbn.com/index.html のホームページのソースを入力した結果を先頭 5 行、
最後の 5 行を示しなさい。

なお、取り扱える行数は実行時のコンピュータのメモリーのサイズのみに
依存しなければなりません。勝手な上限を設けてはいけません。』

CとC++のどちらでも構いません。よろしくお願いします。


714 名前:デフォルトの名無しさん :04/11/23 16:34:48
課題
『標準入力からテキストファイルを読み込み、行を短い順に出力しなさい。
但し、行は最大 80 文字とし、 80 文字以上の行は先頭 80 文字だけの行として取扱い出力し、
空行は出力しないで下さい。
また、同じ長さの行は入力した順番に出しなさい。
レポートでは、実行例として、作成したソースプログラムをプログラムに入力した出力と、
http://www.bbn.com/index.html のホームページのソースを入力した結果を先頭 5 行、
最後の 5 行を示しなさい。

なお、取り扱える行数は実行時のコンピュータのメモリーのサイズのみに
依存しなければなりません。勝手な上限を設けてはいけません。』

CとC++のどちらでも構いません。よろしくお願いします。


715 名前:デフォルトの名無しさん :04/11/23 16:36:28
VC++7.1付属のSTLってスレッドセーフですか?
スレッドセーフじゃないならSTLPortに置き換えちゃおうと思うんですが。

716 名前:デフォルトの名無しさん :04/11/23 16:37:25
>>713
宿題スレへGo!


717 名前:デフォルトの名無しさん :04/11/23 16:38:43
VC++7.1持ってんならヘルプにもろ「Thread Safety in the Standard C++ Library」って項目あるだろうが。

718 名前:デフォルトの名無しさん :04/11/23 16:53:25
>>698
最近の cppll は悪い例だったな。

719 名前:デフォルトの名無しさん :04/11/23 16:53:55
課題
『標準入力からテキストファイルを読み込み、行を短い順に出力しなさい。
但し、行は最大 80 文字とし、 80 文字以上の行は先頭 80 文字だけの行として取扱い出力し、
空行は出力しないで下さい。
また、同じ長さの行は入力した順番に出しなさい。
レポートでは、実行例として、作成したソースプログラムをプログラムに入力した出力と、
http://www.bbn.com/index.html のホームページのソースを入力した結果を先頭 5 行、
最後の 5 行を示しなさい。

なお、取り扱える行数は実行時のコンピュータのメモリーのサイズのみに
依存しなければなりません。勝手な上限を設けてはいけません。』

CとC++のどちらでも構いません。よろしくお願いします。

できれば、夜の7時までにお願いします。その後遊びに行きたいので。


720 名前:デフォルトの名無しさん :04/11/23 17:32:21
大変だ、後一時間半しかないぞ!

721 名前:デフォルトの名無しさん :04/11/23 18:04:12
課題
『標準入力からテキストファイルを読み込み、行を短い順に出力しなさい。
但し、行は最大 80 文字とし、 80 文字以上の行は先頭 80 文字だけの行として取扱い出力し、
空行は出力しないで下さい。
また、同じ長さの行は入力した順番に出しなさい。
レポートでは、実行例として、作成したソースプログラムをプログラムに入力した出力と、
http://www.bbn.com/index.html のホームページのソースを入力した結果を先頭 5 行、
最後の 5 行を示しなさい。

なお、取り扱える行数は実行時のコンピュータのメモリーのサイズのみに
依存しなければなりません。勝手な上限を設けてはいけません。』

CとC++のどちらでも構いません。よろしくお願いします。

夜の7時までにお願いします。今コンパ中なんで、帰ったらできてるようにな。


722 名前:デフォルトの名無しさん :04/11/23 18:56:06
>>721
激しくむかつく奴だな
赤っ恥かいたうえ絶対に単位もらえっこないネタ用意しといてやろうか

723 名前:デフォルトの名無しさん :04/11/23 19:00:17
>>722
ネタニマジレスカコワルイ

724 名前:デフォルトの名無しさん :04/11/23 19:03:11
ちなみにそれ、コピペ。俺が答えたのに無視したからな。
http://pc5.2ch.net/test/read.cgi/tech/1100530682/303

725 名前:デフォルトの名無しさん :04/11/23 19:07:14
>>724
そいつ多分ここにもマルチしてるよ。質問の内容が同じだし。
http://www2.realint.com/cgi-bin/tarticles.cgi?pointc+18210

726 名前:デフォルトの名無しさん :04/11/23 19:08:20
無視したんじゃなくて、解答してもらえたことすら理解できてないんだろう

727 名前:デフォルトの名無しさん :04/11/23 20:29:31
C++Primerのサンプルコードにこういう行がありました。
typedef vector<string, allocator> textwords;

以下のようにしないとエラーになるんですが、
コンパイラとGCCのSTLのどっちが正しいのでしょうか?
typedef vector<string, allocator<string> > textwords;

728 名前:デフォルトの名無しさん :04/11/23 20:31:21
>>727
何ページの何行よ?俺も試してみるから。

729 名前:デフォルトの名無しさん :04/11/23 20:33:37
>>728
ページ数はちょっと分りませんが、chap12のprg12_2.Cです。
gcc−3.4.3で
$g++ prog12_2.C
としただけなので何かオプションが必要なの、かもしれません。

730 名前:デフォルトの名無しさん :04/11/23 20:34:18
いや、それ以前にallocatorのデフォルトテンプレート・パラメータ値は
存在しないので、前者は明らかな間違い。誤植か、作者のミスだろう。

731 名前:デフォルトの名無しさん :04/11/23 20:37:01
>>728
日本語版C++Primer第3版なら、P607にあるぞ。

typedef vector<string> textwords;

に直されてる。英語版の原著の間違いだろ。

732 名前:デフォルトの名無しさん :04/11/23 20:43:52
>>727

typedef vector<string, allocator> textwords;
を受理するためには
template <class STR, template <class X> class ALC>
class vector
{
ALC<STR> for_exsample;
};
のように定義されている必要があるな。


733 名前:デフォルトの名無しさん :04/11/23 20:51:23
>>730-731 どもです。
私の持ってる英語版のはP583にサンプルコードと同じように載っていました。

またGCCのSTL、bits/stl_vector.hでは
template<typename _Tp, typename _Alloc = allocator<_Tp> >
class vector : protected _Vector_base<_Tp, _Alloc>
のようになっていました。
bits/allocator.hは見てみましたが>>730さんの言うとおりデフォルト
テンプレートパラメータはないようでした。

734 名前:デフォルトの名無しさん :04/11/23 21:00:15
>>732
template <class STR, template <class X> class ALC = allocator<_Tp> >
class vector : protected _Vector_base<_Tp, _Alloc>
こういうテンプレートの定義はありなんですかね。

735 名前:デフォルトの名無しさん :04/11/23 21:01:51
>>734
> template <class STR, template <class X> class ALC = allocator<_Tp> >
 template <class STR, template <class X> class ALC = allocator >
ありなら、こうじゃないか

736 名前:デフォルトの名無しさん :04/11/23 21:02:00
template <class STR, template <class X> class ALC = allocator<STR> >
class vector : protected _Vector_base<STR, ALC>

あ、こうだった。ちょっと調べてきます。

737 名前:デフォルトの名無しさん :04/11/23 21:26:37
>736
だ〜が〜ら〜,それ通らねえべって.allocator<STR>は型でねーが.
デンプレートデンプレートパラメーダに代入できるわけないべさ.

738 名前:デフォルトの名無しさん :04/11/23 21:36:15
>>737
template <class STR, template <class> class ALC = allocator>
class vector : protected _Vector_base<STR, ALC<STR> >
あ、こうかな!w

739 名前:デフォルトの名無しさん :04/11/24 00:05:48
>>493
コンストラクタとデストラクタから仮想関数を呼べないなんて知らなかったよ。。。

明日会社行ったらソースを見直してみます。

740 名前:デフォルトの名無しさん :04/11/24 00:15:23
厳密に言うと、呼ばれないのはオーバロードされた派生クラスの
仮想関数ってことかな?

派生クラスのコンストラクタ、デストラクタで呼ばれるのは基底クラスの
仮想関数ってことなんだよね?

ほんまかいな。

741 名前:デフォルトの名無しさん :04/11/24 00:30:08
>>740
>厳密に言うと、呼ばれないのはオーバロードされた派生クラスの
>仮想関数ってことかな?

違う、ctor/dtorを実行中は *this へのメッセージについて virtual の効力がない


742 名前:デフォルトの名無しさん :04/11/24 00:47:31
まだコンストラクタが呼ばれてない派生先のメンバが呼ばれたらおかしくなるわな。

743 名前:デフォルトの名無しさん :04/11/24 00:49:05
>>741
同じことを言っているように読めるが。

744 名前:740 :04/11/24 00:50:17
>>493のリンク先を読んだけど、>>740とリンク先で書かれているのは
同じつもりなんだけど…

745 名前:デフォルトの名無しさん :04/11/24 00:50:28
>>743
オーバーロード != オーバーライド

746 名前:デフォルトの名無しさん :04/11/24 00:52:17
>>742
なるほど、たしかにそうだね。

ではJavaでは派生クラスのメンバ関数が呼ばれるのはどういうこと
なんだろうか。

747 名前:743 :04/11/24 00:52:26
あぁあああああああああ・・・・orz

死ねよ>>740
何ナチュラルに間違えてんだ。

748 名前:740 :04/11/24 00:53:49
>>745
スマソ たしかにオーバライドですわ。

749 名前:デフォルトの名無しさん :04/11/24 00:57:30
>>746
Javaは猿でも出来るのが建前だから、
まったく同じはずのコードが場所によって違う振る舞いをするのは好ましくないから
そういう特別扱いはしないことにした、そうだ。

なんかJavaって仕様策定してるやつらも猿なんだなぁ。
かえって厄介な問題を内包させただけじゃん。

750 名前:デフォルトの名無しさん :04/11/24 01:00:08
コンストラクタでは仮想関数によるテンプレートパターンが使えないんだよねー


■過去ログ置き場に戻る■ 1- 前250 次250 最新50
DAT2HTML 0.33f Converted.