C++相談室 part54
■ このスレッドは過去ログ倉庫に格納されています
0001v(^・^)v
2006/10/30(月) 22:34:08ただし質問の前にはFAQに一通り目を通してください。
IDE(VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
テンプレその他 >>2-15 付近参照
前スレ
C++相談室 part53
http://pc8.2ch.net/test/read.cgi/tech/1159340181/
0357デフォルトの名無しさん
2006/11/09(木) 17:59:030358デフォルトの名無しさん
2006/11/09(木) 17:59:55ありがとうございます。
boostのラムダ読んでみます
0359デフォルトの名無しさん
2006/11/10(金) 15:02:15ってVS2005では使えないのでしょうか?
何かコード中でincludepathを設定する方法はないのでしょうか
0360デフォルトの名無しさん
2006/11/10(金) 15:22:04インクルードするときにフルパスで書けばいいんでね?
例えば #include "/usr/include/stdio.h"とか。
つーか、スレ違いだがね。
0361デフォルトの名無しさん
2006/11/10(金) 23:31:20Cの構造体をC++のクラスにラップしたいんだけど
typedef stract a
struct a *next;
...
}A;
こんなかんじでnextで別のポインタ参照するような構造体を
ラップするときってどうしてる?
0362デフォルトの名無しさん
2006/11/10(金) 23:38:32こんなかんじ、といっても文法めちゃくちゃで何をしたいのか分からない。
構造体をクラスでラップするとはどういう意味?
とりあえず落ち着いて話せ。
0363デフォルトの名無しさん
2006/11/10(金) 23:41:10struct a *next;
...
}A;;
こんなのだよこんなの、
0364デフォルトの名無しさん
2006/11/10(金) 23:43:180365デフォルトの名無しさん
2006/11/10(金) 23:44:02A* next;
..
};
ってことか?
0366デフォルトの名無しさん
2006/11/10(金) 23:45:45これだけだと、どういうパターンを適用するのか判断が難しいなぁ。
単純なラップじゃなくなるけど、
自分ならstd::list + std::list::iteratorみたいに巡回と管理のクラスの二つにわけるかな。
0367デフォルトの名無しさん
2006/11/10(金) 23:48:49ふむふむそっかぁ、同じデータ構造なんだけど
全然別々の名前のリスト状のデータ構造があって
ベタにCのデータ構造操作する部分記述したくないんだけど
やっぱそうやるしかないかぁ
0368デフォルトの名無しさん
2006/11/11(土) 00:06:58言葉のニュアンスも読む人間の考えに任せるしかないのにそれは酷いだろう。
言葉を改めろよ。
0369デフォルトの名無しさん
2006/11/11(土) 00:26:42自分の事しか考えてないんだから。
0370デフォルトの名無しさん
2006/11/11(土) 00:37:53template <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:14class 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特殊化すればいいだけなんじゃないの?
本に書いてあることだよ?
0373デフォルトの名無しさん
2006/11/11(土) 00:55:550374370
2006/11/11(土) 01:24:25どうもありがとうございます。
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ポインタ同士の比較は配列の要素間の前後関係という意味になる。オーバーロードはできない。
そのオーバーロードの宣言は *a1 > a2 としたときに使われる。
0377デフォルトの名無しさん
2006/11/11(土) 04:17:16int 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;
}
0378375
2006/11/11(土) 05:04:06ちなみに
priority_queue<A*, vector<A*, allocator<A*> >, greater<A*> >
にAをtの昇順に入れてやろうと思ったのですが、
おそらくそれが原因で上手くソート出来ませんでした。
うまい解決策はありませんでしょうか。
0379デフォルトの名無しさん
2006/11/11(土) 05:47:04greater<A*> を専用の比較関数で置きかえれ。
0380デフォルトの名無しさん
2006/11/11(土) 06:56:53http://www.boost.org/libs/iterator/doc/iterator_facade.html#tutorial-example
0381デフォルトの名無しさん
2006/11/11(土) 09:26:35class CTest {
public:
void func(){ };
}
int main() {
CTest t;
cout << &(t.func) << endl; // エラー
cout << (CTest::func) << endl; // 問題ないが、必ず値が1となる
}
0382デフォルトの名無しさん
2006/11/11(土) 09:31:04アンドが抜けてました失礼。
0383デフォルトの名無しさん
2006/11/11(土) 10:10:560384デフォルトの名無しさん
2006/11/11(土) 11:07:10VC2005EEにてビルドしたらこのようなエラー構文が出ました。
対処方法を教えてください。
※○○はわしの名前
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定義する場合どのように定義すればよいのでしょうか?
0387デフォルトの名無しさん
2006/11/11(土) 12:05:23&(CTest::func) じゃなくて &CTest::func じゃないと駄目らしいぜ。 (5.3.1 -3-)
0388デフォルトの名無しさん
2006/11/11(土) 12:07:28アンドって書くと条件式の論理関になるから、記号の&単体はアンパサンドと表記するのが正しかったような
0389デフォルトの名無しさん
2006/11/11(土) 12:08:20規格の 24.1 にある要件を満たすような型として定義する。
わりと面倒なんだけど boost の iterator ライブラリを使うと楽が出来る。 >>380
0390デフォルトの名無しさん
2006/11/11(土) 12:30:27ストリームに対するoperator<<に void (CTest::func*)() を取るものがないので
暗黙の型変換でboolのやつが呼ばれてるんだろ。
0391デフォルトの名無しさん
2006/11/11(土) 14:16:12うまい事言うね
0392デフォルトの名無しさん
2006/11/11(土) 14:26:31DLLで解決。
0393デフォルトの名無しさん
2006/11/11(土) 14:54:13どうもすいません
それしたあと、再度ビルドしたんですがまた同じエラー構文が出ました。
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表示設定を変えただけなんだから、その後にソース見て修正しないと駄目に決まってるだろ。
0395デフォルトの名無しさん
2006/11/11(土) 14:57:39全角スペースを半角スペースにしろ!
0396デフォルトの名無しさん
2006/11/11(土) 15:00:40同じエラーなら貼らんでいい。総じて、脳みそが足りてないんじゃないか?
0397デフォルトの名無しさん
2006/11/11(土) 15:09:030398デフォルトの名無しさん
2006/11/11(土) 15:10:440399デフォルトの名無しさん
2006/11/11(土) 15:12:09もう来るな 氏ねカス
0400デフォルトの名無しさん
2006/11/11(土) 15:17:41この構文です。
どう見ても半角ですよぉ・・・
「さん、こんにちは。」は全角ですけど本に沿ってんですよぉ・・・
0401デフォルトの名無しさん
2006/11/11(土) 15:19:20~~~~~~~~~~
空 白
空 白
空 白
ほんとに >> 385 をやったのか?
0402デフォルトの名無しさん
2006/11/11(土) 15:21:42そうしたらソースコードのところに→マークがいっぱいでます
これをどうすんです・・・
0403デフォルトの名無しさん
2006/11/11(土) 15:21:53"さん、こんにちは。"を試しに"xxx"でやってみたら通る?
0404デフォルトの名無しさん
2006/11/11(土) 15:23:500405デフォルトの名無しさん
2006/11/11(土) 15:24:210406デフォルトの名無しさん
2006/11/11(土) 15:25:04頼みますよマジで
0407デフォルトの名無しさん
2006/11/11(土) 15:25:24いっそその行消してもっかい全部書き直せ。
0408デフォルトの名無しさん
2006/11/11(土) 15:25:390409デフォルトの名無しさん
2006/11/11(土) 15:29:41じゃあ
MessageBox::Show("xxx");
では?
0410デフォルトの名無しさん
2006/11/11(土) 15:32:52みんなありがとございましたぁ・・
0411デフォルトの名無しさん
2006/11/11(土) 15:33:21できれば原因も教えて欲しい
0412デフォルトの名無しさん
2006/11/11(土) 15:35:310413デフォルトの名無しさん
2006/11/11(土) 15:35:490414デフォルトの名無しさん
2006/11/11(土) 15:36:55氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね
もうくんなもうくんなもうくんなもうくんなもうくんなもうくんなもうくんなもうくんな
0415デフォルトの名無しさん
2006/11/11(土) 15:37:07ドンマイです(;^^;)
0416デフォルトの名無しさん
2006/11/11(土) 15:37:230417デフォルトの名無しさん
2006/11/11(土) 15:38:30相談です。
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おもしろいです。このスレにいて本当に良かったと思える一日でした
0419デフォルトの名無しさん
2006/11/11(土) 15:44:150420デフォルトの名無しさん
2006/11/11(土) 17:33:480421デフォルトの名無しさん
2006/11/11(土) 17:52:02って言ってるようなもんだからな。
0422デフォルトの名無しさん
2006/11/11(土) 18:04:100423デフォルトの名無しさん
2006/11/11(土) 20:57:160424デフォルトの名無しさん
2006/11/11(土) 20:59:17質問にすら来ないでわからないことをほったらかしにするやつのほうがやばい
0425デフォルトの名無しさん
2006/11/11(土) 21:00:350426デフォルトの名無しさん
2006/11/11(土) 21:10:030427デフォルトの名無しさん
2006/11/11(土) 21:15:010428デフォルトの名無しさん
2006/11/11(土) 21:22:53コンパイルエラーです。
0429427
2006/11/11(土) 21:23:26|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:260431デフォルトの名無しさん
2006/11/11(土) 21:25:150432デフォルトの名無しさん
2006/11/11(土) 21:33:26マ板にも書き込んでるんだな
0433デフォルトの名無しさん
2006/11/11(土) 21:37:41http://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:06C++/CLIだろう。
それにC#だったらSystem.Windows.Formsって書くし
0437デフォルトの名無しさん
2006/11/11(土) 22:25:410438デフォルトの名無しさん
2006/11/12(日) 10:54:36プログラマってのは偏屈でプライドが高いから
答えてやってるっていう意識が強いんだろう。
まぁ本来それが正しい姿勢だと思うがね
0439デフォルトの名無しさん
2006/11/12(日) 11:10:08呼び出し元の変数を弄るとき以外に場合はある?
0440デフォルトの名無しさん
2006/11/12(日) 11:12:01constくっつけて変更防止させたりして。
0441デフォルトの名無しさん
2006/11/12(日) 11:37:38計測はしてないから、どの程度効果があるか分からんが
0442デフォルトの名無しさん
2006/11/12(日) 11:41:40コピーコンストラクタとかの処理が重たいクラスは、
積極的に参照渡しにしたほうがよさげ。
0443デフォルトの名無しさん
2006/11/12(日) 11:46:15俺は呼び出し側で引数を弄りたい場合はポインタ、
弄らなくてもいいけどコピーさせたくない場合はconst参照にしてる。
0444デフォルトの名無しさん
2006/11/12(日) 15:08:55NULL渡す場合があるならポインタ。
0445デフォルトの名無しさん
2006/11/12(日) 16:21:12void func() throw();
宣言だけに付ければいいのでしょうか?
それとも実装の方にも付けなければいけないのでしょうか?
0446デフォルトの名無しさん
2006/11/12(日) 16:29:37それって「私は例外投げませんよ」って指定じゃなかった?
0447デフォルトの名無しさん
2006/11/12(日) 16:38:41そんなことは分かったうえでの質問だろう。たぶん。
0448デフォルトの名無しさん
2006/11/12(日) 17:22:25お尋ねしたいのは、それを宣言に付けさえすれば良いのか、定義の方にも
付けねばならないのかということです。
0449デフォルトの名無しさん
2006/11/12(日) 17:27:37訊く前に実験実験。
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:51vcとg++とbcc。
時間があるなら標準規格読む。
0452デフォルトの名無しさん
2006/11/12(日) 20:35:39http://www.jisc.go.jp/
でX3014で検索。
PDFを開いてから例外指定で検索。
0453デフォルトの名無しさん
2006/11/12(日) 22:32:40class 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:33void 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デフォルトのコピーコンストラクタが参照の初期化に
コピー元への参照を使ってしまうから、コピー元が
破棄されることによって不正な参照が残ってしまう。
0456デフォルトの名無しさん
2006/11/12(日) 22:54:17■ このスレッドは過去ログ倉庫に格納されています