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/
0322デフォルトの名無しさん
2006/11/08(水) 19:38:51ポインタがtypedefの情報もってるって…何か壮大に勘違いしてないか?
0323デフォルトの名無しさん
2006/11/08(水) 19:49:41typedef a+b c と同じような事だと思った。
0324デフォルトの名無しさん
2006/11/08(水) 20:02:22{ typedef typename T::myint type; };
template<typename T> struct RemovePointer<T*>
{ typedef typename T::myint type; };
typedef RemovePointer<psttest>::type mymyint;
0325デフォルトの名無しさん
2006/11/08(水) 20:08:530327デフォルトの名無しさん
2006/11/08(水) 20:53:06vectorに値を格納していって、
for(int i = 0; i < n; i++){
for(int j = 0; j < x; j++)
cout << (*v[i])[j] << endl;
}
で表示するんですけど、
(*v[i])[j] ってどういう意味なんでしょうか?
不勉強で申し訳ないのですが、ご教授をお願いできないでしょうか?
0328デフォルトの名無しさん
2006/11/08(水) 20:56:19v の i 番目 (0から数える。以下も同様) に入っているポインタが指す先にある
vector<double>型のインスタンスの、j番目の要素への参照。
0329デフォルトの名無しさん
2006/11/08(水) 20:57:57おかしくないか?
*v[i][j]だと思うが。
0330デフォルトの名無しさん
2006/11/08(水) 20:59:54vector<double*>と勘違いしてた。
0331デフォルトの名無しさん
2006/11/08(水) 21:02:34ありがとうございます!
助かりました!
>>329
参考書をそのまま写したんですが、
おっしゃる通りにやってみたところ、
エラーになりました。
0332デフォルトの名無しさん
2006/11/08(水) 21:03:060333デフォルトの名無しさん
2006/11/08(水) 22:18:37なかなかのバカ丸出しぶりでしたな
0334デフォルトの名無しさん
2006/11/08(水) 22:41:120335デフォルトの名無しさん
2006/11/08(水) 22:47:32感づくあたりだけ 316 の方がましだと思う。
文法めちゃくちゃでも一応コンパイルしてみる勇気も買うw
「ポインター」じゃなくて「ポインター型」と書いていればもっと良かったけど。
0336デフォルトの名無しさん
2006/11/08(水) 23:12:54どうアセンブラのコードとにらめっこしても
そんなコードはいてねぇよ
0337デフォルトの名無しさん
2006/11/08(水) 23:53:350338デフォルトの名無しさん
2006/11/09(木) 00:07:15template<typename Function> void call(Function f) { f(); }
Function が関数ポインタなら、おそらくインライン展開は行われない。
Function が関数オブジェクトなら、普通にインライン展開の対象になる。
0339デフォルトの名無しさん
2006/11/09(木) 01:10:02Named Template Parameterの情報って、どのへんを調べれば出てくる?
ttp://www.kmonos.net/alang/cpp/glossary.html
にさわりだけ出てるんだが、もうちょっと具体的なやつが見つからなくて。
0340デフォルトの名無しさん
2006/11/09(木) 02:03:12クラステンプレートの中にメンバ関数テンプレートがあります。
template< typename T >
class MyClass {
public:
template< typename U > void f( const U& u );
};
この関数f()をクラスの宣言外で定義する書き方が分かりません。
どなたか分かる方がいらっしゃればご教示願います。
以上、宜しくお願いいたします。
0341デフォルトの名無しさん
2006/11/09(木) 02:11:22template< typename U >
void MyClass<T>::f( const U& u ) {
...
}
0342デフォルトの名無しさん
2006/11/09(木) 02:38:280343デフォルトの名無しさん
2006/11/09(木) 03:01:56や、そのぐらいはしてある。
…といいつつ出てきたエントリをうろちょろしてたら、
わりといいのが見つかった。thx。
ttp://d.hatena.ne.jp/uskz/20060607/p1
まあ何となくはわかった気になれた。
もうちょっとちゃんと知りたいなら、"C++ Templates" を読めという感じらしい。
0344デフォルトの名無しさん
2006/11/09(木) 06:35:32これが思考停止ってやつですかorz
NTPすげー
0345デフォルトの名無しさん
2006/11/09(木) 07:34:43struct D1 :public B {};
struct D2 :public B {};
class DD1 :public D1, public D2{};
int main(){
printf( "%d\n", sizeof( DD1::H ) );
return 0;
}
これコンパイル通ったんだが、
typedefの場合はメソッドとかと違って曖昧無しにコンパイラが解決してくれるの?
0346デフォルトの名無しさん
2006/11/09(木) 09:12:40D1::H と D2::H が同じものを指すので、 DD1::H という名前の検索自体は問題ない。
曖昧な基底クラスでエラーになるのは、そっから先の使い方によるらしい。
(4.11-2, 5.2.5-5)
0347デフォルトの名無しさん
2006/11/09(木) 11:06:22その場合、関数だと曖昧だけどtypedefの場合は大丈夫らしい
NTPの場合は仮想継承を使って基底クラスのtypedefしたものをoverrideしてる。
class B; // typedef int H;
class D1 :virtual public B; //typedef char H;
class D2 :virtual public B; //なにもしない
class DD1 :public D1, D2;
で、DD1::Hはcharになる。
ただの継承だとHは名前解決失敗するっぽい
名前解決は複雑だなー、、、
0348デフォルトの名無しさん
2006/11/09(木) 12:21:06policy_category を使って、SmartPtr のポリシーを自動判別。
http://www.cuj.com/documents/s=8890/cujexp0310alexandr/
3年前にこれを見たとき、正直感動した。
smart_ptr<T, storage<_> > でもいいし、
smart_ptr<T, ref_counted<_> > でもいい。
0349デフォルトの名無しさん
2006/11/09(木) 12:58:20最近は Boost.MPL でかなり高度なTMP の土台が用意されているので,
そちらを使えばもっと直接かつ見通しの良い形で実装できるような気もします.
http://thread.gmane.org/gmane.comp.lib.boost.devel/81060/focus=81080
0350デフォルトの名無しさん
2006/11/09(木) 13:01:34この程度の単純なコールバックだと,コンパイル時評価可能な
関数ポインタ値ならインライン展開しうるコンパイラもあります. MSVC とか.
0351デフォルトの名無しさん
2006/11/09(木) 16:38:090352デフォルトの名無しさん
2006/11/09(木) 16:51:540353デフォルトの名無しさん
2006/11/09(木) 17:06:380354デフォルトの名無しさん
2006/11/09(木) 17:16:23わかんねー(´д`;
<_>とか、boost::mplがわからんです。
というかboost使ったことない・・・
0355デフォルトの名無しさん
2006/11/09(木) 17:24:32とりあえずlambdaだけ使って味噌。
笑うくらいスッゲェーとか思うから。
後は興味が354を導くはず
0356デフォルトの名無しさん
2006/11/09(木) 17:24:48ref_counted<_> は、lambda の _1 と同じく引数のプレイスホルダで、
この場合 T に展開される。
>>348 の smart_ptr< T, ref_counted<_> > は、コンパイル時に以下のように
書くのと同じ効果がある。
smart_ptr< T, ref_counted<T> >
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って言ってるようなもんだからな。
■ このスレッドは過去ログ倉庫に格納されています