トップページ⇒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/
0322デフォルトの名無しさん2006/11/08(水) 19:38:51
>>321
ポインタがtypedefの情報もってるって…何か壮大に勘違いしてないか?
0323デフォルトの名無しさん2006/11/08(水) 19:49:41
>>316がしたい事は別の構文で書くと、

typedef a+b c と同じような事だと思った。
0324デフォルトの名無しさん2006/11/08(水) 20:02:22
template<typename T> struct RemovePointer
{ 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:53
なるほど、ポインタ型で特殊化するわけか・・・
03263162006/11/08(水) 20:11:52
>>324
できました
感謝
0327デフォルトの名無しさん2006/11/08(水) 20:53:06
vector<vector<double>* > v;

vectorに値を格納していって、

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:19
>>327
v の i 番目 (0から数える。以下も同様) に入っているポインタが指す先にある
vector<double>型のインスタンスの、j番目の要素への参照。
0329デフォルトの名無しさん2006/11/08(水) 20:57:57
>>327
おかしくないか?
*v[i][j]だと思うが。
0330デフォルトの名無しさん2006/11/08(水) 20:59:54
すまん
vector<double*>と勘違いしてた。
0331デフォルトの名無しさん2006/11/08(水) 21:02:34
>>328
ありがとうございます!
助かりました!

>>329
参考書をそのまま写したんですが、
おっしゃる通りにやってみたところ、
エラーになりました。
0332デフォルトの名無しさん2006/11/08(水) 21:03:06
はい。勉強になりました。
0333デフォルトの名無しさん2006/11/08(水) 22:18:37
>>322-323

なかなかのバカ丸出しぶりでしたな
0334デフォルトの名無しさん2006/11/08(水) 22:41:12
316よりましだけどな。
0335デフォルトの名無しさん2006/11/08(水) 22:47:32
template も知ってるようだし、「何かやり方があるんじゃないか」と
感づくあたりだけ 316 の方がましだと思う。
文法めちゃくちゃでも一応コンパイルしてみる勇気も買うw

「ポインター」じゃなくて「ポインター型」と書いていればもっと良かったけど。
0336デフォルトの名無しさん2006/11/08(水) 23:12:54
関数ポインタより効率いいっていうけど嘘じゃね?
どうアセンブラのコードとにらめっこしても
そんなコードはいてねぇよ
0337デフォルトの名無しさん2006/11/08(水) 23:53:35
って関数オブジェクトのことな
0338デフォルトの名無しさん2006/11/09(木) 00:07:15
>>336
template<typename Function> void call(Function f) { f(); }

Function が関数ポインタなら、おそらくインライン展開は行われない。
Function が関数オブジェクトなら、普通にインライン展開の対象になる。
0339デフォルトの名無しさん2006/11/09(木) 01:10:02
ちょっと質問。

Named 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:22
template< typename T >
template< typename U >
void MyClass<T>::f( const U& u ) {
...
}
0342デフォルトの名無しさん2006/11/09(木) 02:38:28
>>339 http://www.google.co.jp/search?q=%22Named+Template+Parameter%22
0343デフォルトの名無しさん2006/11/09(木) 03:01:56
>>342
や、そのぐらいはしてある。

…といいつつ出てきたエントリをうろちょろしてたら、
わりといいのが見つかった。thx。
ttp://d.hatena.ne.jp/uskz/20060607/p1

まあ何となくはわかった気になれた。
もうちょっとちゃんと知りたいなら、"C++ Templates" を読めという感じらしい。
0344デフォルトの名無しさん2006/11/09(木) 06:35:32
ModernC++Design読んで満足してた俺はだめだなぁ・・・
これが思考停止ってやつですかorz

NTPすげー
0345デフォルトの名無しさん2006/11/09(木) 07:34:43
struct B{ typedef int H; };
struct 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:40
>>345
D1::H と D2::H が同じものを指すので、 DD1::H という名前の検索自体は問題ない。

曖昧な基底クラスでエラーになるのは、そっから先の使い方によるらしい。
(4.11-2, 5.2.5-5)
0347デフォルトの名無しさん2006/11/09(木) 11:06:22
>>345
その場合、関数だと曖昧だけど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:06
NTP じゃないが、ソレに近いもの。
policy_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
菱形継承使わなくても(というか菱形継承使った NTP 実装は面倒),
最近は Boost.MPL でかなり高度なTMP の土台が用意されているので,
そちらを使えばもっと直接かつ見通しの良い形で実装できるような気もします.

http://thread.gmane.org/gmane.comp.lib.boost.devel/81060/focus=81080
0350デフォルトの名無しさん2006/11/09(木) 13:01:34
>>338
この程度の単純なコールバックだと,コンパイル時評価可能な
関数ポインタ値ならインライン展開しうるコンパイラもあります. MSVC とか.
0351デフォルトの名無しさん2006/11/09(木) 16:38:09
コード晒してから言え
0352デフォルトの名無しさん2006/11/09(木) 16:51:54
角度とか.
0353デフォルトの名無しさん2006/11/09(木) 17:06:38
ぶっちゃけ、boostの使い方を勉強する方がいいと思った > 複雑なtemplateテクニックを書くより
0354デフォルトの名無しさん2006/11/09(木) 17:16:23
>>348
わかんねー(´д`;
<_>とか、boost::mplがわからんです。
というかboost使ったことない・・・
0355デフォルトの名無しさん2006/11/09(木) 17:24:32
>>354
とりあえずlambdaだけ使って味噌。
笑うくらいスッゲェーとか思うから。

後は興味が354を導くはず
0356デフォルトの名無しさん2006/11/09(木) 17:24:48
>>354
ref_counted<_> は、lambda の _1 と同じく引数のプレイスホルダで、
この場合 T に展開される。
>>348 の smart_ptr< T, ref_counted<_> > は、コンパイル時に以下のように
書くのと同じ効果がある。

smart_ptr< T, ref_counted<T> >
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
「教えられたことを咀嚼する気は全然無いですが、わかるまで教えてください」
って言ってるようなもんだからな。
■ このスレッドは過去ログ倉庫に格納されています