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

C++相談室 part54

■ このスレッドは過去ログ倉庫に格納されています
0001v(^・^)v2006/10/30(月) 22:34:08
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE(VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

テンプレその他 >>2-15 付近参照

前スレ
C++相談室 part53
http://pc8.2ch.net/test/read.cgi/tech/1159340181/
0357デフォルトの名無しさん2006/11/09(木) 17:59:03
lambda って使うと実行ファイルのサイズがすげー事にならない?
0358デフォルトの名無しさん2006/11/09(木) 17:59:55
>>355>>356
ありがとうございます。
boostのラムダ読んでみます
0359デフォルトの名無しさん2006/11/10(金) 15:02:15
#pragma includepath
ってVS2005では使えないのでしょうか?
何かコード中でincludepathを設定する方法はないのでしょうか
0360デフォルトの名無しさん2006/11/10(金) 15:22:04
>>359
インクルードするときにフルパスで書けばいいんでね?
例えば #include "/usr/include/stdio.h"とか。
つーか、スレ違いだがね。
0361デフォルトの名無しさん2006/11/10(金) 23:31:20
あのさー
Cの構造体をC++のクラスにラップしたいんだけど

typedef stract a
struct a *next;
...
}A;

こんなかんじでnextで別のポインタ参照するような構造体を
ラップするときってどうしてる?
0362デフォルトの名無しさん2006/11/10(金) 23:38:32
>>361
こんなかんじ、といっても文法めちゃくちゃで何をしたいのか分からない。
構造体をクラスでラップするとはどういう意味?
とりあえず落ち着いて話せ。
0363デフォルトの名無しさん2006/11/10(金) 23:41:10
typedef stract a{
struct a *next;
...
}A;;
こんなのだよこんなの、
0364デフォルトの名無しさん2006/11/10(金) 23:43:18
意味がわからにあ
0365デフォルトの名無しさん2006/11/10(金) 23:44:02
class A {
A* next;
..
};

ってことか?
0366デフォルトの名無しさん2006/11/10(金) 23:45:45
>>363
これだけだと、どういうパターンを適用するのか判断が難しいなぁ。
単純なラップじゃなくなるけど、
自分ならstd::list + std::list::iteratorみたいに巡回と管理のクラスの二つにわけるかな。
0367デフォルトの名無しさん2006/11/10(金) 23:48:49
>>366
ふむふむそっかぁ、同じデータ構造なんだけど
全然別々の名前のリスト状のデータ構造があって

ベタにCのデータ構造操作する部分記述したくないんだけど
やっぱそうやるしかないかぁ
0368デフォルトの名無しさん2006/11/11(土) 00:06:58
掲示板をまるで会話のように使うとは。
言葉のニュアンスも読む人間の考えに任せるしかないのにそれは酷いだろう。
言葉を改めろよ。
0369デフォルトの名無しさん2006/11/11(土) 00:26:42
朝鮮人に何を言っても無駄。
自分の事しか考えてないんだから。
0370デフォルトの名無しさん2006/11/11(土) 00:37:53
テンプレートクラスに関する質問です。

template <class T>
class Sample
{
public:
   Sample(const T& t) : m_t(t){}
private:
   T m_t;
};

みたいな事をやったとき、class Tには何でも指定できてしまいますが、
このclass Tをあるクラスのサブクラスのみに指定したいのです。
どうしたら、いいのでしょうか?

環境は
vs2005 WinXPPro,SP2です。
0371デフォルトの名無しさん2006/11/11(土) 00:49:14
template <typename T>
class Sample
{
   BOOST_STATIC_ASSERT(boost::is_base_and_derived<あるクラス, T>::value);
public:
   Sample(const T& t) : m_t(t){}
private:
   T m_t;
};
0372デフォルトの名無しさん2006/11/11(土) 00:52:11
>>370
特殊化すればいいだけなんじゃないの?
本に書いてあることだよ?
0373デフォルトの名無しさん2006/11/11(土) 00:55:55
子供が全部public継承してるなら、テンプレートじゃなくて基本クラス要求すればいいんじゃない?
03743702006/11/11(土) 01:24:25
is_base_and_derivedでぐぐったら、それらしい情報が出てきました。
どうもありがとうございます。
0375デフォルトの名無しさん2006/11/11(土) 04:02:04
オペレータをオーバーロードして、
クラスAのポインタでクラスの中身(int t)を比較したいんですが、

bool operator< (A *a) const{
return (t < a->t);
}
bool operator> (A *a) const {
return (t > a->t);
}
とクラスに書いてやって、

A *a1 = new A;
A *a2 = new A;
a1->t = 2;
a2->t = 1;
これで、a1 > a2
をしても真にならないのですが、どこか間違ってますでしょうか?
0376デフォルトの名無しさん2006/11/11(土) 04:15:35
>>375
ポインタ同士の比較は配列の要素間の前後関係という意味になる。オーバーロードはできない。
そのオーバーロードの宣言は *a1 > a2 としたときに使われる。
0377デフォルトの名無しさん2006/11/11(土) 04:17:16
struct A {
int t;
bool operator<(const A& a) const{
return (t < a.t);
}
bool operator>(const A& a) const {
return (t > a.t);
}
};

int main()
{
A* a1 = new A;
A* a2 = new A;
a1->t = 2;
a2->t = 1;
std::cout << std::boolalpha << (*a1 > *a2) << std::endl;
}
03783752006/11/11(土) 05:04:06
>>376,377 なるほど、ありがとうございます。

ちなみに
priority_queue<A*, vector<A*, allocator<A*> >, greater<A*> >
にAをtの昇順に入れてやろうと思ったのですが、
おそらくそれが原因で上手くソート出来ませんでした。
うまい解決策はありませんでしょうか。
0379デフォルトの名無しさん2006/11/11(土) 05:47:04
>>378
greater<A*> を専用の比較関数で置きかえれ。
0380デフォルトの名無しさん2006/11/11(土) 06:56:53
>>361
http://www.boost.org/libs/iterator/doc/iterator_facade.html#tutorial-example
0381デフォルトの名無しさん2006/11/11(土) 09:26:35
class 内の関数のアドレスを取る事が出来ないのはなぜでしょうか。

class CTest {
public:
void func(){ };
}

int main() {
CTest t;
cout << &(t.func) << endl; // エラー
cout << (CTest::func) << endl; // 問題ないが、必ず値が1となる
}
0382デフォルトの名無しさん2006/11/11(土) 09:31:04
cout << &(CTest::func) << endl; // 問題ないが、必ず値が1となる

アンドが抜けてました失礼。
0383デフォルトの名無しさん2006/11/11(土) 10:10:56
static void func()アドレスをとるようになってるから。
0384デフォルトの名無しさん2006/11/11(土) 11:07:10
相談です。

VC2005EEにてビルドしたらこのようなエラー構文が出ました。
対処方法を教えてください。
※○○はわしの名前

c:\documents and settings\○○\my documents\visual studio 2005\projects\hello\hello\Form1.h(98) : error C3872: '0x3000': この文字を識別子で使用することはできません
c:\documents and settings\○○\my documents\visual studio 2005\projects\hello\hello\Form1.h(98) : error C3872: '0x3000': この文字を識別子で使用することはできません
c:\documents and settings\○○\my documents\visual studio 2005\projects\hello\hello\Form1.h(98) : error C2653: '  MessageBox' : 識別子がクラス名でも名前空間名でもありません。
c:\documents and settings\○○\my documents\visual studio 2005\projects\hello\hello\Form1.h(98) : error C2664: 'void System::Windows::Forms::Form::Show(System::Windows::Forms::IWin32Window ^)' :
1 番目の引数を 'System::String ^' から 'System::Windows::Forms::IWin32Window ^' に変換できません。
0385デフォルトの名無しさん2006/11/11(土) 11:33:30
全 角 空 白

編集⇒詳細⇒スペースの表示
0386デフォルトの名無しさん2006/11/11(土) 12:01:04
iteratorって使い方は解るのですが、自分の作るクラスに
定義する場合どのように定義すればよいのでしょうか?
0387デフォルトの名無しさん2006/11/11(土) 12:05:23
>>382
&(CTest::func) じゃなくて &CTest::func じゃないと駄目らしいぜ。 (5.3.1 -3-)
0388デフォルトの名無しさん2006/11/11(土) 12:07:28
>>382
アンドって書くと条件式の論理関になるから、記号の&単体はアンパサンドと表記するのが正しかったような
0389デフォルトの名無しさん2006/11/11(土) 12:08:20
>>386
規格の 24.1 にある要件を満たすような型として定義する。
わりと面倒なんだけど boost の iterator ライブラリを使うと楽が出来る。 >>380
0390デフォルトの名無しさん2006/11/11(土) 12:30:27
>>381
ストリームに対するoperator<<に void (CTest::func*)() を取るものがないので
暗黙の型変換でboolのやつが呼ばれてるんだろ。
0391デフォルトの名無しさん2006/11/11(土) 14:16:12
>>213
うまい事言うね
0392デフォルトの名無しさん2006/11/11(土) 14:26:31
>>357
DLLで解決。
0393デフォルトの名無しさん2006/11/11(土) 14:54:13
>>385
どうもすいません
それしたあと、再度ビルドしたんですがまた同じエラー構文が出ました。

c:\documents and settings\○○\my documents\visual studio 2005\projects\hello\hello\Form1.h(98) : error C3872: '0x3000': この文字を識別子で使用することはできません
c:\documents and settings\○○\my documents\visual studio 2005\projects\hello\hello\Form1.h(98) : error C3872: '0x3000': この文字を識別子で使用することはできません
c:\documents and settings\○○\my documents\visual studio 2005\projects\hello\hello\Form1.h(98) : error C2653: '  MessageBox' : 識別子がクラス名でも名前空間名でもありません。
c:\documents and settings\○○\my documents\visual studio 2005\projects\hello\hello\Form1.h(98) : error C2664: 'void System::Windows::Forms::Form::Show(System::Windows::Forms::IWin32Window ^)' :
1 番目の引数を 'System::String ^' から 'System::Windows::Forms::IWin32Window ^' に変換できません。(新しい機能 ; ヘルプを参照)
使用可能なユーザー定義された変換演算子がない、または
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
0394デフォルトの名無しさん2006/11/11(土) 14:56:19
>>393
表示設定を変えただけなんだから、その後にソース見て修正しないと駄目に決まってるだろ。
0395デフォルトの名無しさん2006/11/11(土) 14:57:39
>>393
全角スペースを半角スペースにしろ!
0396デフォルトの名無しさん2006/11/11(土) 15:00:40
>>393
同じエラーなら貼らんでいい。総じて、脳みそが足りてないんじゃないか?
0397デフォルトの名無しさん2006/11/11(土) 15:09:03
いや、構文見たらちゃんと半角スペースなってますよぉ
0398デフォルトの名無しさん2006/11/11(土) 15:10:44
なってないからエラーが出てるんだ
0399デフォルトの名無しさん2006/11/11(土) 15:12:09
98行目をもう一回書きなおせ
もう来るな 氏ねカス
0400デフォルトの名無しさん2006/11/11(土) 15:17:41
MessageBox::Show(textBox1->Text + "さん、こんにちは。");

この構文です。
どう見ても半角ですよぉ・・・
「さん、こんにちは。」は全角ですけど本に沿ってんですよぉ・・・
0401デフォルトの名無しさん2006/11/11(土) 15:19:20
全 角 「空 白」
     ~~~~~~~~~~

空 白


空 白


空 白

ほんとに >> 385 をやったのか?

0402デフォルトの名無しさん2006/11/11(土) 15:21:42
やりましたよぉ・・・
そうしたらソースコードのところに→マークがいっぱいでます
これをどうすんです・・・
0403デフォルトの名無しさん2006/11/11(土) 15:21:53
>>400
"さん、こんにちは。"を試しに"xxx"でやってみたら通る?
0404デフォルトの名無しさん2006/11/11(土) 15:23:50
ダメです・・・
0405デフォルトの名無しさん2006/11/11(土) 15:24:21
「わし」とか「よぉ・・・」とかキモ過ぎ。おまけにバカときた。消えてくれ。
0406デフォルトの名無しさん2006/11/11(土) 15:25:04
いやいい加減に出来とかんといかんのですよ
頼みますよマジで
0407デフォルトの名無しさん2006/11/11(土) 15:25:24
もういいや。MessageBox の前に全角スペースがあるだろ。それを半角スペースに直せ。
いっそその行消してもっかい全部書き直せ。
0408デフォルトの名無しさん2006/11/11(土) 15:25:39
答えが見つからないととりあえず質問者を叩く、と。
0409デフォルトの名無しさん2006/11/11(土) 15:29:41
>>404
じゃあ

MessageBox::Show("xxx");

では?
0410デフォルトの名無しさん2006/11/11(土) 15:32:52
どうやら出来たようです。
みんなありがとございましたぁ・・
0411デフォルトの名無しさん2006/11/11(土) 15:33:21
>>410
できれば原因も教えて欲しい
0412デフォルトの名無しさん2006/11/11(土) 15:35:31
>>407指摘のMessageBOXの前の空白が全角だったのが原因でした・・・ぁ
0413デフォルトの名無しさん2006/11/11(土) 15:35:49
4時間も前から正解でてたのにな・・・
0414デフォルトの名無しさん2006/11/11(土) 15:36:55
>>412
氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね
もうくんなもうくんなもうくんなもうくんなもうくんなもうくんなもうくんなもうくんな
0415デフォルトの名無しさん2006/11/11(土) 15:37:07
>>412
ドンマイです(;^^;)
0416デフォルトの名無しさん2006/11/11(土) 15:37:23
とほほ・・・ほ
0417デフォルトの名無しさん2006/11/11(土) 15:38:30
322 名前:デフォルトの名無しさん[sage] 投稿日:2006/11/11(土) 11:08:59
相談です。


VC++2005EEにてビルドしたらこのようなエラー構文が出ました。
対処方法を教えてください。
※○○はわしの名前

c:\documents and settings\○○\my documents\visual studio 2005\projects\hello\hello\Form1.h(98) : error C3872: '0x3000': この文字を識別子で使用することはできません
c:\documents and settings\○○\my documents\visual studio 2005\projects\hello\hello\Form1.h(98) : error C3872: '0x3000': この文字を識別子で使用することはできません
c:\documents and settings\○○\my documents\visual studio 2005\projects\hello\hello\Form1.h(98) : error C2653: '  MessageBox' : 識別子がクラス名でも名前空間名でもありません。
c:\documents and settings\○○\my documents\visual studio 2005\projects\hello\hello\Form1.h(98) : error C2664: 'void System::Windows::Forms::Form::Show(System::Windows::Forms::IWin32Window ^)' :
1 番目の引数を 'System::String ^' から 'System::Windows::Forms::IWin32Window ^' に変換できません。

323 名前:デフォルトの名無しさん[sage] 投稿日:2006/11/11(土) 11:20:55
>>322
全角スペースを半角に置換する

325 名前:デフォルトの名無しさん[sage] 投稿日:2006/11/11(土) 11:25:34
すいません、なるべく煽らんで下さい
0418デフォルトの名無しさん2006/11/11(土) 15:39:47
>>417
おもしろいです。このスレにいて本当に良かったと思える一日でした
0419デフォルトの名無しさん2006/11/11(土) 15:44:15
俺じゃねえ
0420デフォルトの名無しさん2006/11/11(土) 17:33:48
エラー読めないヤツって生きてる価値ないよね。
0421デフォルトの名無しさん2006/11/11(土) 17:52:02
「教えられたことを咀嚼する気は全然無いですが、わかるまで教えてください」
って言ってるようなもんだからな。
0422デフォルトの名無しさん2006/11/11(土) 18:04:10
まるで朝鮮人のような奴だな。
0423デフォルトの名無しさん2006/11/11(土) 20:57:16
こんなのが職場に居たらやってられんな
0424デフォルトの名無しさん2006/11/11(土) 20:59:17
質問してくれるだけいい
質問にすら来ないでわからないことをほったらかしにするやつのほうがやばい
0425デフォルトの名無しさん2006/11/11(土) 21:00:35
五十歩百歩だと思うが。
0426デフォルトの名無しさん2006/11/11(土) 21:10:03
どっちが五十歩でどっちが百歩だ?
0427デフォルトの名無しさん2006/11/11(土) 21:15:01
そんなことはどっちでもよいからこそ五十歩百歩と言うのだ。
0428デフォルトの名無しさん2006/11/11(土) 21:22:53
それでは曖昧性があります。
コンパイルエラーです。
04294272006/11/11(土) 21:23:26
i|!| |i┏┓! i!┏┳┓| |||i|!i| ||!i|| |||ii| ||| ||| |i||!|i│i!┏┓i!|
|i|┏┛┗━╋┻┛|i!||!|ii|| i|!i||i|┏━┓ ┏┓i|i| i┃┃i!|
i||┗┓┏┓┃||i┏━━━━┓┗━┛ ┃┃|i||!i┃┃i!|
|i |!|i┃┃┃┃i||┗━━━━┛|i|| || ||||!┃┃i|i| i┗┛!i|
i||i ||┃┃┃┃|! |||i ||i    !|||!|┏━━┛┃|i||!i┏┓i|!
|i!i |!┗┛┗┛i|!i|  / |   / | ┗━━━┛i|i| i┗┛i!|
i| |||i|!i| ||!|i||i!   /,_ ┴─/ ヽ      |!i| ||| |i||!|i|i|||| ||i
|i|| ||i!i||     (_゜.,》.'(_゜,》)ミ ヽ       ! | |!i||!|ii||!|ii|
i|ii        / ,,__,ニ、、 ノ( |           i|i!|i|
|i        | Y~~/~y} `, ~ |  そ、そんなー…   |i
!.          | ,k.,.,!,.,.,r| ,!  く             |
i        / <ニニニ'ノ    \               l
0430デフォルトの名無しさん2006/11/11(土) 21:24:26
くだらないAA張ってうけるとでも思ってるのか
0431デフォルトの名無しさん2006/11/11(土) 21:25:15
初盆(´・ω・`)
0432デフォルトの名無しさん2006/11/11(土) 21:33:26
さっきのコンパイルエラー出て助けてくれってやつLinux板にも
マ板にも書き込んでるんだな
0433デフォルトの名無しさん2006/11/11(土) 21:37:41
これか
http://pc8.2ch.net/test/read.cgi/prog/1159668078/451
0434デフォルトの名無しさん2006/11/11(土) 21:57:25
親切な奴多いよな
いちいちバカに答えてるの。
(軽蔑の意味じゃなくて)普通にすばらしいと思う
0435デフォルトの名無しさん2006/11/11(土) 22:17:04
なぜかム板は律儀でもあるけど、ネタに対して攻撃的な反応が多いのが(´・ω・`)
ところで
> System::Windows::Forms:: ってC#じゃないの C++/CLIとか?
0436デフォルトの名無しさん2006/11/11(土) 22:20:06
^演算子(GC管理のリソースを指すポインタ)が使われているから
C++/CLIだろう。

それにC#だったらSystem.Windows.Formsって書くし
0437デフォルトの名無しさん2006/11/11(土) 22:25:41
そか、サンクス .net触ったことないからわからんかった
0438デフォルトの名無しさん2006/11/12(日) 10:54:36
>>435
プログラマってのは偏屈でプライドが高いから
答えてやってるっていう意識が強いんだろう。
まぁ本来それが正しい姿勢だと思うがね
0439デフォルトの名無しさん2006/11/12(日) 11:10:08
C++で引数に参照渡しを行う場合って
呼び出し元の変数を弄るとき以外に場合はある?
0440デフォルトの名無しさん2006/11/12(日) 11:12:01
コピーさせずに関数に引き渡す場合とか。
constくっつけて変更防止させたりして。
0441デフォルトの名無しさん2006/11/12(日) 11:37:38
string はだいたい、const string& として渡してるな
計測はしてないから、どの程度効果があるか分からんが
0442デフォルトの名無しさん2006/11/12(日) 11:41:40
>>439
コピーコンストラクタとかの処理が重たいクラスは、
積極的に参照渡しにしたほうがよさげ。
0443デフォルトの名無しさん2006/11/12(日) 11:46:15
>>439
俺は呼び出し側で引数を弄りたい場合はポインタ、
弄らなくてもいいけどコピーさせたくない場合はconst参照にしてる。
0444デフォルトの名無しさん2006/11/12(日) 15:08:55
弄りたい場合も参照渡ししてる。
NULL渡す場合があるならポインタ。
0445デフォルトの名無しさん2006/11/12(日) 16:21:12
関数が投げる例外を指定する下の例のようなthrowは
void func() throw();
宣言だけに付ければいいのでしょうか?
それとも実装の方にも付けなければいけないのでしょうか?
0446デフォルトの名無しさん2006/11/12(日) 16:29:37
>>445
それって「私は例外投げませんよ」って指定じゃなかった?
0447デフォルトの名無しさん2006/11/12(日) 16:38:41
>>446
そんなことは分かったうえでの質問だろう。たぶん。
0448デフォルトの名無しさん2006/11/12(日) 17:22:25
それはわかってます。
お尋ねしたいのは、それを宣言に付けさえすれば良いのか、定義の方にも
付けねばならないのかということです。
0449デフォルトの名無しさん2006/11/12(日) 17:27:37
>>447
訊く前に実験実験。

struct hoge{
void payo()throw();
};

//void hoge::payo()throw(){}
void hoge::payo(){}
//error: declaration of `void hoge::payo()' throws different exceptions
0450デフォルトの名無しさん2006/11/12(日) 17:46:56
実験しても環境依存やコンパイラのバグの可能性があるので
仕様そのものを知りたいなあと。
因みに、VC8だとそのコードが通ります。
0451デフォルトの名無しさん2006/11/12(日) 18:28:51
そういう時俺は持ってるコンパイラ全部で通してみるけど。
vcとg++とbcc。
時間があるなら標準規格読む。
0452デフォルトの名無しさん2006/11/12(日) 20:35:39
>>450
http://www.jisc.go.jp/
でX3014で検索。
PDFを開いてから例外指定で検索。
0453デフォルトの名無しさん2006/11/12(日) 22:32:40
#include <windows.h>
class Coordinate{
public:
Coordinate(void): x(coo.X) , y(coo.Y) {}
short& x;
short& y;
COORD coo;
};
class Recta{
public:
Recta(void): t(rec.top) , b(rec.bottom), l(rec.left) , r(rec.right) {}
long& t;
long& b;
long& l;
long& r;
RECT rec;
};
Coordinate C( int x , int y ){
Coordinate c;
c.x = x;
c.y = y;
return c;
}
Recta R( Coordinate c1 , Coordinate c2 ){
Recta r;
r.l = c1.x;
r.t = c1.y;
r.r = c2.x;
r.b = c2.y;
return r;
}
0454続き2006/11/12(日) 22:39:33
>>453
void main(){
Recta r = R( C( 1, 1 ) , C( 10 , 10 ) );
}


環境:VisualStudio.net 2002
やろうとしてること・・・
1. Windows組み込みのCOORDやRECTを、COORDやRECTとして使えるように維持しつつ機能を拡張する
 (サンプルなので余計なメンバ関数は省いてますが)
2. COORD.X とかを小文字のxでアクセスできるように参照変数を付ける
3. (mainでは)頂点を二つ指定して正方形を作る

上のソースを実行すると、四角形の頂点の値が滅茶苦茶な値になっています
(初期化されてない値っぽい?)
1ステップずつ実行すると、どうやらC関数で座標を作るところまではできていて
Cの戻り値でR関数を実行する時点でおかしくなっているようなのですが
どうしてそうなるのかが判りませんです・・・
どこか根本的に無理なことをしようとしてるのでしょうか
0455デフォルトの名無しさん2006/11/12(日) 22:53:08
>>454
デフォルトのコピーコンストラクタが参照の初期化に
コピー元への参照を使ってしまうから、コピー元が
破棄されることによって不正な参照が残ってしまう。
0456デフォルトの名無しさん2006/11/12(日) 22:54:17
MFCのCRectのソースでも見れ
■ このスレッドは過去ログ倉庫に格納されています