C++相談室 part89

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part88
http://hibari.2ch.net/test/read.cgi/tech/1297142195/

このスレもよろしくね。
http://hibari.2ch.net/test/read.cgi/tech/1299218426/

ついでに壁紙にしてね。
http://www.research.att.com/~bs/Bjarne.jpg

2デフォルトの名無しさん:2011/05/03(火) 17:23:41.26
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
 http://www.cppreference.com/ (英語)
 http://www.cppreference.com/wiki/jp/ (↑の日本語訳だけどまだ未完)
[Stroustrup大聖人]
 http://www2.research.att.com/~bs/
[C++ International Standard]
 http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38110
[JTC1/SC22/WG21 - C++]
 http://www.open-std.org/jtc1/sc22/wg21/
  ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
[JIS X3014]
 http://www.jisc.go.jp/app/pager?id=15868
  ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。
3デフォルトの名無しさん:2011/05/03(火) 17:24:01.92
■Libraries■
[Boost]
 Boost http://www.boost.org/
 (日本語) http://www.kmonos.net/alang/boost/
 (日本語) http://shinh.skr.jp/boost/
[標準ライブラリ]
 SGI-STL http://www.sgi.com/tech/stl/
 STLport http://stlport.sourceforge.net/
 GNU libstdc++ http://gcc.gnu.org/libstdc++/
 Apache C++ Standard Library (STDCXX) http://stdcxx.apache.org/
 STLFilt http://www.bdsoft.com/tools/stlfilt.html
 (日本語) http://episteme.wankuma.com/stlprog/ (※1999年発行注意)
[Loki]
 http://sourceforge.net/projects/loki-lib/
 LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
4デフォルトの名無しさん:2011/05/03(火) 17:24:24.38
5デフォルトの名無しさん:2011/05/03(火) 17:24:44.44
6デフォルトの名無しさん:2011/05/03(火) 17:45:21.12
C#もよろしく
7デフォルトの名無しさん:2011/05/03(火) 19:06:40.60
TwitterでC++ユーザを自称する奴らは何故総じてキモいのか?
ああいうニワカはマジで消えて欲しい
彼らはもっと批判的な態度を取るべきだ
8デフォルトの名無しさん:2011/05/03(火) 19:12:01.39
>>1
乙です
9デフォルトの名無しさん:2011/05/03(火) 21:25:04.74
C++超初心者なんですけど
コードの中に時々出てくる『:』(コロン)『::』(コロン2つ)
ってなんなんですか?
10デフォルトの名無しさん:2011/05/03(火) 21:30:08.27
>>9
コロン 2 個は名前空間
コロン 1 個は三項演算子とか switch 文の区切りとか

同じ記号を使っていますが、意味的には全く関係ありません
分かり辛いですよね・・・
11デフォルトの名無しさん:2011/05/03(火) 21:36:58.60
>>9
コロン1つは>>10
コロン2つは「○○::△△」で○○の△△を表す。
「北海道::山田太郎」で北海道の山田太郎さんをあらわす記法
12デフォルトの名無しさん:2011/05/03(火) 21:49:05.27
>>10-11
なるほどー、たしかに似てるのに全然違う意味なんですね。
分かりやすく教えて頂き、ありがとうございます。
13デフォルトの名無しさん:2011/05/03(火) 23:00:45.74
おっとclass Hoge : public Fuga
継承の:も忘れてはならんぜ
14デフォルトの名無しさん:2011/05/03(火) 23:14:37.92
for(;;)ってfor(::)じゃダメだったの?
15デフォルトの名無しさん:2011/05/03(火) 23:19:22.88
それおkにすると三項演算を使うとすごい見にくくなりそうだな
16デフォルトの名無しさん:2011/05/03(火) 23:44:44.19
while では充分ありうるし
17デフォルトの名無しさん:2011/05/03(火) 23:47:33.34
C++って多くの記号を使うように見えて、意外に @ とか $ とか ` とかは使ってないですよね。
* とか & に複数の意味を持たせるくらいなら、@ とか使えば良かったと思うのですが、
自称C++上級者の皆様はどうお考えですか。
18デフォルトの名無しさん:2011/05/03(火) 23:49:42.26
どうでもいい
19デフォルトの名無しさん:2011/05/03(火) 23:54:16.63
>> とかなあ・・・
20デフォルトの名無しさん:2011/05/04(水) 00:06:02.98
@Hoge pHoge -> hoge; // Hoge *pHoge = &hoge;
pHoge.func(); // pHoge->func();
pHoge -> hoge2; // pHoge = &hoge2;
pHoge.func(); // pHoge->func();
pHoge = @hoge; // pHoge = &hoge;
僕の考えた最強のポインタ構文
21デフォルトの名無しさん:2011/05/04(水) 00:43:25.96
@とか$とかはバックスラッシュみたいに別の文字であることがある
トライグラフを増やすのはいやだったんだろう
22デフォルトの名無しさん:2011/05/04(水) 01:00:51.36
基本的に B に準じる方針で
@ と $ はアセンブラ絡みでなんとなくいや
` は絶対いらん!と男塾ばりの意地で死亡確認
23デフォルトの名無しさん:2011/05/04(水) 01:13:52.49
左矢印演算子はなぜないのか
24デフォルトの名無しさん:2011/05/04(水) 01:22:12.02
アロー演算子は面倒だと思うんだ
C#みたいに . で済ませればハッピーだったのに
25デフォルトの名無しさん:2011/05/04(水) 01:24:50.58
参照とポインタをちゃんと意味あって残してるのにそれは無理
26デフォルトの名無しさん:2011/05/04(水) 01:53:00.28
>>24
昔はアロー演算子なんかなかったから全部 . だった。
27デフォルトの名無しさん:2011/05/04(水) 02:05:40.71
ポインタ型がメンバを持たなければ
. だけで -> も兼ねれば良い
28デフォルトの名無しさん:2011/05/04(水) 03:05:34.91
->* ってやらしいな
29デフォルトの名無しさん:2011/05/04(水) 03:18:36.30
->(i)
30デフォルトの名無しさん:2011/05/04(水) 04:32:55.42
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
31デフォルトの名無しさん:2011/05/04(水) 07:12:44.00
C# みたいに明示的にオーバーライドする方法ってありますか?
または「この関数はこの関数をオーバーライドしたもの」であることをチェック(例えば boost::static_assert 的なもので)する方法はありますか?
32デフォルトの名無しさん:2011/05/04(水) 11:22:11.00
>>31
基底クラスの関数にvirtualを付けなければ継承クラスの同名関数は無条件にオーバーライドされる
しかしそれをチェックする方法はない

これがC++の一つの問題点だ
実際に関数を呼び出してどちらが呼び出されるかは、クラスの定義を読まなければ分からない
33デフォルトの名無しさん:2011/05/04(水) 12:18:33.08
>>31
クラスの継承関係と調べたい関数名がわかってればできるんじゃね?
static_assert(
is_super_sub<sup, sub>::value &&
has_XXX<sup>::value &&
has_XXX<sub>::value);
こんな感じで
継承関係にあって同じメソッド名前を持ってればオーバーライド=trueだよね
34デフォルトの名無しさん:2011/05/04(水) 17:43:02.48
Doxygen+Graphvizで作図させてみれば一目瞭然だけどな
35デフォルトの名無しさん:2011/05/05(木) 07:09:33.64
>>32
それだとオーバーロードになりませんか?

>>33
シグネチャが一致していることを調べる関数は無いんじゃないかな
36デフォルトの名無しさん:2011/05/05(木) 09:24:05.71
クラス内に構造体を定義し、
その型をメンバ関数の引数の型にしたいのですが、
コンパイルできません。
その関数は、privateで内部からのみ呼ぶつもりです。
どうすればよいでしょうか?


雰囲気はこういう感じです。

ヘッダーファイル
template<typename T>
class Tree {
private:
struct treeFormat{};
treeFormat & searchParent(const T &parent, const treeFormat ¤t);
};

ソースファイル
template<typename T> Tree::treeData & Tree<T>::searchParent(const T &parent, const Tree::treeFormat ¤t) {}
3736:2011/05/05(木) 09:29:45.73
ソースが間違えていました。
どちらにしても、コンパイルは通りませんが…
template<typename T> treeFormat & Tree<T>::searchParent(const T &parent, const treeFormat ¤t) {}
38デフォルトの名無しさん:2011/05/05(木) 09:36:07.30
template <typename T>
typename Tree<T>::treeFormat &
searchParent(const T &parent, const typename Tree<T>::treeFormat ¤t);
3936:2011/05/05(木) 09:42:23.91
>>38
structの前にtypedefを付けると、コンパイル出来ました。
ありがとうございます。
4036:2011/05/05(木) 10:05:18.77
>>38
typedefは関係なかったです。
戻り値に「typename Tree<T>::」を付けると、コンパイルされました。
仮引数には付けなくてもコンパイルされたので、勘違いしました。
ありがとうございます。
41デフォルトの名無しさん:2011/05/05(木) 10:11:04.91
templateはめんどくさいからクラス定義の中に関数定義まで全部書いたほうがいいと思う
42デフォルトの名無しさん:2011/05/05(木) 10:19:05.66
ある本に配列要素の個数を調べる関数
template<int N> int number(double (&a)[N])
{
return N;
}

int main()
{
double b[]={1,2,3,4,5,6,7,8};
std::cout << number(b) << std::endl;

return 0;
}
が載っていたのですが、関数numberの引数 (&a)[N]の意味が
わかりません。これってどう解釈したらいいですか?
43デフォルトの名無しさん:2011/05/05(木) 10:27:51.22
「要素数Nのdouble配列型」への参照
44デフォルトの名無しさん:2011/05/05(木) 10:36:13.89
>>43 ありがとうございます。

うーん、参照ですか。 ()がないと double& a[N]となって
a[N]に対する参照になってしまうから、それを防ぐために()を
つけたと...

なんか、2次元配列を受け取る関数の引数

f(double (*x)[N]) {・・・}

で、*xに()をつけるのと似ていますね。
45デフォルトの名無しさん:2011/05/05(木) 10:50:09.65
>double& a[N]となってa[N]に対する参照になってしまう

VC++では「参照」の配列(サイズN)と解釈されて、エラーになってしまいますね。
46デフォルトの名無しさん:2011/05/05(木) 13:16:30.58
さあ次は配列の参照を返す関数をtypedefを使わずに書くんだ
47デフォルトの名無しさん:2011/05/05(木) 13:20:21.50
template <class T> T f(void);

f<int (&)[5]>();
48デフォルトの名無しさん:2011/05/05(木) 13:51:18.87
templateを使ったクラスのコンストラクタ、デストラクタについてです。

ヘッダーファイル(sample.h)は次の通りです。
template<typename T>
class sample{
 sample();
 virtual ~sample();
};

cppファイルは次の通りです。
template<typename T>Tree<T>::Tree(){}
template<typename T>Tree<T>::~Tree() {}

他のソースでsample.hをインクルードし、「sample<int> foo;」と記述すると、以下のようなエラーが出ます。
undefined reference to `sample<int>::sample()

テンプレートを使う場合、どのようにコンストラクタ・デストラクタを定義すればよいでしょうか。
49デフォルトの名無しさん:2011/05/05(木) 13:52:57.13
間違いました。
ソースは以下の通りです。
template<typename T>sample<T>::sample(){}
template<typename T>sample<T>::~sample() {}

よろしくお願いします。
50デフォルトの名無しさん:2011/05/05(木) 13:56:05.16
テンプレートの場合cppに実体は無理
全部へっだにかきなはれ
51デフォルトの名無しさん:2011/05/05(木) 14:07:04.03
>>48
コンストラクタもデストラクタもprivateになっているけどいいのか
52デフォルトの名無しさん:2011/05/05(木) 14:27:28.18
>>35
>それだとオーバーロードになりませんか?

なんでだよ
オーバーロードってのは引数の型や数が違う関数を定義する事だろうが
混乱してない?
53デフォルトの名無しさん:2011/05/05(木) 14:30:11.81
単なる名前の隠蔽
54デフォルトの名無しさん:2011/05/05(木) 14:32:20.73
>>50
どうしてもcppに書きたい場合、以下のような宣言が必要なのですね。
template class sample<int>;

>>51
あ、間違えていました。
55デフォルトの名無しさん:2011/05/05(木) 15:57:57.31
>>53

禿げ同
56デフォルトの名無しさん:2011/05/05(木) 16:31:15.73
>>52
確かに、オーバーロードじゃなくて>>53が正解だ。失礼しました

結局のところ、明示的なオーバーライド関連の話は無理っぽいな・・・
57デフォルトの名無しさん:2011/05/05(木) 16:44:48.67
暗黙的なオーバーライドってどうやるの?
58デフォルトの名無しさん:2011/05/05(木) 18:49:37.14
class Base
{
 virtual void Hoge() { ... }
};

class Derived : public Base
{
 void Hoge() { ... }
}
59デフォルトの名無しさん:2011/05/05(木) 19:07:01.35
明示的なオーバーライドは?
60デフォルトの名無しさん:2011/05/05(木) 19:17:52.36
class Derived : public Base
{
 virtual void Hoge() { ... }
}
61デフォルトの名無しさん:2011/05/05(木) 19:33:28.34
基底が非virtualだったら破綻するよね
62デフォルトの名無しさん:2011/05/05(木) 19:57:43.28
class Derived : public Base
{
 virtual void Hoge() override;
}

C++0xにご期待ください
63デフォルトの名無しさん:2011/05/05(木) 20:01:38.16
何故virtualなのかはわからないけど
overrideキーワードは不毛なやり取りに終止符が打たれていいですね
64デフォルトの名無しさん:2011/05/05(木) 20:07:09.36
>>60からコピペしたからvirtual消すの忘れてた
65デフォルトの名無しさん:2011/05/06(金) 10:59:20.07
何で前付けにならなかったんだろう

void Hoge() override;
override void Hoge();
66デフォルトの名無しさん:2011/05/06(金) 11:00:20.57
overrideって型名の返り値使ってる人が死ぬからじゃないか
67デフォルトの名無しさん:2011/05/06(金) 14:55:15.29
int hoge() const;
const int hoge();

戻り値に対する装飾じゃなく関数に対するものだから構文の一貫性取れてるでしょ
68デフォルトの名無しさん:2011/05/06(金) 23:48:01.11
template <class T> class Hoge
{
public:
template <class U> Hoge(Hoge<U> const & other) { ・・・ } // A

Hoge(Hoge const & other) { ・・・ } // B
};


↑のようなケースでAがあればBがなくてもコピーするのに特に問題ないんだけど
そういう場合ってBをわざわざ書く意味あるかな?
というかHoge<T>::Hoge<T>とHoge<T>::Hogeの違いがわからん
69デフォルトの名無しさん:2011/05/06(金) 23:55:25.48
テンプレートコンストラクタはコピーコンストラクタにならないんじゃなかったっけ
70デフォルトの名無しさん:2011/05/07(土) 00:49:30.22
71デフォルトの名無しさん:2011/05/07(土) 09:19:52.62
あーなるほど暗黙さんが仕事しちゃうのね
72デフォルトの名無しさん:2011/05/07(土) 09:49:06.02
>>67
int hoge() virtual;
virtual int hoge();
73デフォルトの名無しさん:2011/05/09(月) 17:56:18.83
shared_from_this ってコンストラクタ内じゃ使えないよね?
初期化時にインスタンス自身の shared_ptr を使いたいばあい、

class Hoge
{
private:
 typedef Hoge this_class;

public:
 typedef boost::shared_ptr<this_class> shared_ptr;

 shared_ptr Create()
 {
  shared_ptr p(new this_class);
  ... // ここで shared_ptr を使った初期化をする。
  return p;
 }

protected:
 Hoge() {}
};

こんな感じで、Create() の中で初期化するしか無いんですか?
74デフォルトの名無しさん:2011/05/10(火) 03:19:45.73
例外について質問があります。
少々長いので http://codepad.org/Zlh8RjWp に貼りました。
お願いします。
75デフォルトの名無しさん:2011/05/10(火) 03:25:58.70
typeofじゃダメなの?
76デフォルトの名無しさん:2011/05/10(火) 05:27:30.14
std::exception を継承してるなら what() をオーバーライドすればいいよ
77デフォルトの名無しさん:2011/05/10(火) 06:23:41.02
>>74 俺ならこう書くかなあ…うう腹痛い…
#include <stdexcept>
#include <iostream>
class foo_exception : public std::runtime_error {
public: explicit foo_exception( const std::string& what_arg ) : std::runtime_error( what_arg ) {};
};
void f1( void ) { throw std::runtime_error( "ehh" ); }
void f2( void ) { throw foo_exception( "gee" ); }
void check( void (*f)(void) ) {
 try {
  f();
 } catch( foo_exception& e ) {
  std::cout << "foo_exception" << std::endl;
  std::cout << e.what() << std::endl;
 } catch( std::runtime_error& e ) {
  std::cout << "std::runtime_error" << std::endl;
  std::cout << e.what() << std::endl;
 }
}
int main( void )
{
 check(f1);
 check(f2);
 return 0;
}

Output:
std::runtime_error
ehh
foo_exception
gee
7877:2011/05/10(火) 07:04:35.63
これもありでしょうか…?
class foo_exception : public std::runtime_error {
public: explicit foo_exception( const std::string& what_arg ) : std::runtime_error( "foo_exception: " + what_arg ) {};
};
void f1( void ) { throw std::runtime_error( "ehh" ); }
void f2( void ) { throw foo_exception( "gee" ); }
void check( void (*f)(void) ) {
 try {
  f();
 } catch( exception& e ) {
  std::cout << e.what() << std::endl;
 }
}
int main( void )
{
check(f1);
check(f2);
return 0;
}

Output:
ehh
foo_exception: gee
79デフォルトの名無しさん:2011/05/10(火) 11:30:03.29
例外クラスを弄ることが出来なければ
const library::exception&でcatchして、typeidで分けるしか無いんじゃないの?
80デフォルトの名無しさん:2011/05/10(火) 16:58:24.48
>>77,78
まずは日本語を正しく解析しろ
81デフォルトの名無しさん:2011/05/10(火) 18:05:18.61
ごめんね(´・ω・`)
82デフォルトの名無しさん:2011/05/10(火) 18:08:29.86
コールバックかRTTIかマクロぐらいかなぁ
コールバックラムダがあればいいけど03じゃ書くのがめんどい
RTTIはコストがいやだから俺だったらマクロ選ぶかな
http://ideone.com/7cMUd
幸いにもtry-catchはブロックだから副作用も少ない
83デフォルトの名無しさん:2011/05/10(火) 18:40:28.57
コンテナの指定した位置の要素を削除する方法ってどのようにしていますか?
今自分はitr=hoge.begin()してforループでitrを1つずつ増やして指定の位置に来たらerase・・・としてるんですがなんだか効率が悪そうで
84デフォルトの名無しさん:2011/05/10(火) 18:51:50.76
そういうのはコンテナの種類によって変わるので一概には言えません
アルゴリズムとデータ構造を勉強して、それぞれのコンテナの特性を把握しましょう
85デフォルトの名無しさん:2011/05/10(火) 18:53:47.88
典型的なアホ回答
何も答えないよりたちがわるい
86デフォルトの名無しさん:2011/05/10(火) 19:02:49.96
> コンテナの指定した位置の要素を削除する方法ってどのようにしていますか?
1. 削除処理の対象になるコンテナはどれ?例えば std::list とか、汎用とか
2. 指定する「位置」はどういう形で保持しているの?
87デフォルトの名無しさん:2011/05/10(火) 19:08:38.34
>>85
アホ乙
88デフォルトの名無しさん:2011/05/10(火) 19:09:03.06
>>86
1.主にdequeを使っています
2 今のところintです。指定位置のitrを返すとかあれば苦労しないんですが
89デフォルトの名無しさん:2011/05/10(火) 19:18:57.02
hoge.erase( hoge.begin() + 2 ); // 先頭から数えて3番目の要素を削除
dequeならできるとおもうお
90デフォルトの名無しさん:2011/05/10(火) 19:26:51.11
it = q.begin();
advance(it, index);
q.erase(it);
91デフォルトの名無しさん:2011/05/10(火) 19:47:21.85
>>89
おお!これはいいですね。ぜひ活用したいと思います

>>90
ほうほう、advanceなんてものがあったのですね
今回は削除だけなので89さんのが1行でよさそうですがこれも活用できそうです。

ありがとうございました
92デフォルトの名無しさん:2011/05/10(火) 22:52:24.85
VC++初心者スレと迷ったがこちらでひとまず。

#pragma setlocale("en-us")

このコードをWin7の32bit、VC++6.0 SP6 + SDK環境でビルドすると、「地域が無効です」とエラーが出てビルドできない
「Win7でVC++6.0はサポートしてませんYO!」というのは承知しているのだが、Win7+VC6環境がある人、
ビルドできるかどうか試してもらえないか?

当方LenovoのPCで、下記修正パッチも出ているので機種の問題かとも思っている。
(ちなみにこのパッチあてても変化なし)
ttp://www-06.ibm.com/jp/domino05/pc/download/download.nsf/jtechinfo/MIGR-75198

Win7だからロケールIDが変わっているのかと思いきや、レジストリ上は0409のところにen-usが入っている
コンパイラが何をもって「無効」と判断するのか、そういった情報でもあると嬉しい
93デフォルトの名無しさん:2011/05/10(火) 23:10:46.73
94デフォルトの名無しさん:2011/05/10(火) 23:51:10.88
c++で入力からeofを受け取ったらループを抜けるようにしたいんですけど
cinでは出来ないんですか

#include <iostream>
using namespace std;

int main(){
int n;
while(cin >> n){
cout << "n:" << n << endl;
}
return 0;
}
とやると、一回目にeofを受け取ると抜けてくれるんですが
二回目以降だと、なぜか二回連続でeofを入力しないと止まりません
> ./eof.exe
^Z
> ./eof.exe
1
n:1
^Z
^Z
>
他にwhile(!cin.eof())とかもやってみたけど上手く動きません
95デフォルトの名無しさん:2011/05/11(水) 00:03:42.08
>>94
ちゃんと一回で抜けるけど? (Visual Studio C++ 2010 Express)

あと、どんな処理系使ってるのか知らんけど、ステップ実行とかできないのか?
96デフォルトの名無しさん:2011/05/11(水) 00:07:19.69
確かに処理系によるかも知れないです
さっきLinuxとgccでやったら抜けました
>>94はwindowsとborlandです
97デフォルトの名無しさん:2011/05/11(水) 00:15:26.67
98デフォルトの名無しさん:2011/05/11(水) 00:27:31.96
>>97
ダメになるページだね。
99デフォルトの名無しさん:2011/05/11(水) 00:33:42.20
>>97
それはちゃんと止まると思います
プログラミングコンテストで書いたそういうCのコードをC++ですっきり書きなおそうと思いまして。
さっきsubmitしたらwhile(cin >> n)でちゃんと抜けてるみたいです。有難うございます
ただCの書き方のほうが実行速度は速そうですね、気のせいかな?

ところで、当方学生なのでVisual Studio 2010 Professionalを持ってますが
その機能の100分の1も使わないのに起動するのがやたら遅いので
コンパイラだけコマンドプロンプトから使おうと思ったんですが
C:\Program Files\Microsoft Visual Studio 10.0\VC\binのパスを通して
>cl test.cpp
みたいに使おうとしたら「MicrosoftR C/C++ Compiler Driverは動作を停止しました」
というメッセージが表示されてコンパイル出来ないんですが…
100デフォルトの名無しさん:2011/05/11(水) 01:08:43.25
あ、powershellでは言われなかったけどコマンドプロンプトだとmspdb100.dllが無いというエラーが出た
で、追加するとインクルードパスが云々。最後はイクルードするようにディレクトリを指示してるのに
そんなファイルはないとか…諦めますた
101デフォルトの名無しさん:2011/05/11(水) 01:14:15.45
VCのフォルダにvcvarsall.batがあったらそれを実行
それと処理系依存はそれぞれの処理系のスレへ
102デフォルトの名無しさん:2011/05/11(水) 01:34:45.06
>>99
一回目の起動は確かにもっさりしているが二回目以降はキャッシュが効いて速いだろ
それにちゃんと.NET Runtime Optimization Service動かしてngen一度動かしてる?
ネイティブイメージを作っておくとかなり速くなる
103デフォルトの名無しさん:2011/05/11(水) 01:54:30.32
>>101
はい、すいません。↓の二つ読んだらなんとか出来ました。有難うございます
http://d.hatena.ne.jp/tt_clown/20090816/p1
http://d.hatena.ne.jp/toburau/20080407/1207580607
104デフォルトの名無しさん:2011/05/14(土) 19:50:33.46
maxとかminのマクロがあってstd::min,std::maxが使えないんですけど
どうすればいいですか。
105デフォルトの名無しさん:2011/05/14(土) 19:52:25.61
undef
106デフォルトの名無しさん:2011/05/14(土) 20:05:15.64
#define NOMINMAX
107デフォルトの名無しさん:2011/05/14(土) 20:16:36.82
windows.hをインクルードしているヘッダがかなり多いから
もう直前で#undefしてる…
108uy:2011/05/15(日) 01:10:47.88
ようするにゴミってことですね
109デフォルトの名無しさん:2011/05/15(日) 01:29:37.31
んなもんコンパイラオプションでDだろ普通
110デフォルトの名無しさん:2011/05/15(日) 02:12:32.03
VC++のコンパイルボタンを押してるだけのここの住人には何を言ってるのか理解できなかった
111デフォルトの名無しさん:2011/05/15(日) 02:16:18.90
わからないやつなんていないだろjk
112デフォルトの名無しさん:2011/05/15(日) 04:51:23.76
コンパイルボタンは10年押してようやく半人前だろ
113デフォルトの名無しさん:2011/05/15(日) 05:00:46.42
おまえらコンパイルは
Ctrl+(Shift+)B派?
F7派?
右クリック「ビルド」派?
メニュー「ビルド」派?
make派?
114デフォルトの名無しさん:2011/05/15(日) 05:53:49.08
>>104
(std::min)(a, b);
115デフォルトの名無しさん:2011/05/15(日) 09:07:26.14
>>107
でかいヘッダなんだから
コンパイル防壁かまさないと
116デフォルトの名無しさん:2011/05/15(日) 11:05:17.52
ほんとに>>114で行けるのか?
117デフォルトの名無しさん:2011/05/15(日) 11:08:33.28
>>115
プリコンパイルヘッダの頭に
#define NOMINMAX
#include <windows.h>
とやってる
118デフォルトの名無しさん:2011/05/15(日) 11:18:53.71
農民マックスか
119デフォルトの名無しさん:2011/05/15(日) 11:20:07.83
一揆
120デフォルトの名無しさん:2011/05/15(日) 11:50:12.60
INT_MIN
殷と民

殷、周、秦、漢、三国、晋、南北朝、隋、唐、五代、宋、元、明、清、中華民国、中華人民共和国
121デフォルトの名無しさん:2011/05/15(日) 11:56:48.22
いいからネタをやれ
122デフォルトの名無しさん:2011/05/15(日) 12:02:32.27
VS2010 (Win7(x64))での XmlLite 開発に関する
参考サイトを教えてください。
そもそもVS2010で開発は可能でしょうか?
123デフォルトの名無しさん:2011/05/15(日) 12:10:57.92
124デフォルトの名無しさん:2011/05/15(日) 12:31:30.63
>>123
早い!
ありがとうございます。
125デフォルトの名無しさん:2011/05/15(日) 14:36:44.48
VS2010です。コンソールアプリでUnicode文字列を楽に表示しようとして
 locale::global(locale("japanese"));
としたら、なぜかostringstreamを経由した数値出力がカンマ付きになります。
wcout << 1234567890 << endl; ではそのようなことは起きません。
wostringstreamのカンマ付加をどうやったらやめさせられますでしょうか…
126デフォルトの名無しさん:2011/05/15(日) 14:50:44.26
127125:2011/05/15(日) 16:39:33.11
>>126
まことにdクス
byplayer様発言の方法で解決できました
(当方ostringstreamでなくてwostringstream使用)

しかしロケール訳解らん、、
TCHARより難しいことを日雇いプログラマに要求しないでホスイ、、
128デフォルトの名無しさん:2011/05/15(日) 17:42:00.56
>>127
ロケールってのは簡単に言うとC++と出力の関係
つまり内部エンコーディングと外部エンコーディングの橋渡し

tcharは内部エンコーディング
129デフォルトの名無しさん:2011/05/15(日) 19:02:14.56
横レスで申し訳ないが、
つまり例えばロケールがCロケールなら、
内部エンコーディングがwchar_tでも、
マルチバイトでOSに渡されちゃうって話?
ちょっと不正確な言い方なのかもしれないけど
130デフォルトの名無しさん:2011/05/15(日) 19:48:28.11
>>129
関数によるけど標準のものに関しては大体それで合ってるはず
ただしシングルバイトな

ロケール設定しない(=Cロケール)で
wchar_tをwfstreamで書き出すと分かるよ
できたファイルはANSI

ロケールを日本にすると
できるファイルはShift_JIS
131デフォルトの名無しさん:2011/05/15(日) 20:31:55.05
>>130
なるほど〜そういうカラクリだったのか
ありがとう。
132デフォルトの名無しさん:2011/05/15(日) 20:44:06.16
C++初心者です
質問なのですがMicrosoft Visual C++ 2010を使って
ファイル名と文字列を入力して文字列が何回出てくるか
表示させるプログラムを作成しました
そこでMicrosoft Visual C++ 2010のデバッグから実行するのではなく
アイコンから起動しブラウザで入力して実行、出力するようにしたいのですが
どうすればいいでしょうか
詳しく載っているサイトも教えてくれると助かります
よろしくお願いします
133デフォルトの名無しさん:2011/05/15(日) 20:51:51.15
>ブラウザで入力
GUIウィンドゥでファイル名等を入力

C++のCLR Windows Formアプリ でプロジェクト作成
134デフォルトの名無しさん:2011/05/15(日) 21:06:25.77
>>132
CGIで検索
135デフォルトの名無しさん:2011/05/15(日) 21:32:05.39
>>132
*.EXE のアイコンをダブルクリックして起動すると表示して終わってしまう?
136デフォルトの名無しさん:2011/05/16(月) 16:55:20.96
const int a[] = {111,222,333,444,555,666,777,888};
const int b[] = {333,444,555};

aの中からbの並びが全て一致する位置を返すようなSTLのアルゴリズム教えてください
137デフォルトの名無しさん:2011/05/16(月) 17:04:24.15
>>136
const int * result = search(a, a + sizeof(a) / sizeof(* a), b, b + sizeof(b) / sizeof(* b));
138デフォルトの名無しさん:2011/05/16(月) 17:40:10.55
0ー1ナップサック問題を動的計画法で解くんだが
それをプログラミングして解ける人いたら教えて。
139デフォルトの名無しさん:2011/05/16(月) 19:18:02.30
>>138
宿題すれにどうぞ
140デフォルトの名無しさん:2011/05/16(月) 19:47:32.56
>>133
>>134
ありがとうございました
試してみます
141デフォルトの名無しさん:2011/05/17(火) 13:42:09.61
仮想関数を仮想関数のポインタ経由で実行した時に何か問題起こったりしますか。
142デフォルトの名無しさん:2011/05/17(火) 14:32:25.48
無いよ
143デフォルトの名無しさん:2011/05/17(火) 19:09:25.96
staticなファクトリ関数の有用性がわからないんですが
クラススコープでアクセスできる便利なインスタンス生成用関数って感じなのでしょうか?
144デフォルトの名無しさん:2011/05/17(火) 20:06:27.07
テンプレートで使ったり
スタックに置くの禁止したり
生成の実態を隠蔽したり
14592:2011/05/17(火) 21:48:47.40
>>93
亀レスになったがサンクス

そのURLのロケールIDでビルドは通った
WinXPで「言語識別子」でビルドできたのは何かの間違いだったということにしよう
146デフォルトの名無しさん:2011/05/18(水) 01:26:03.18
>>144
なるほど、ありがとうございます。
147デフォルトの名無しさん:2011/05/19(木) 10:44:35.66
std::reverse_iterator<int>::base
の戻り値がint型だって保証されてますか。
148デフォルトの名無しさん:2011/05/19(木) 13:22:51.74
>>147
std::reverse_iteratorのテンプレート引数にintは入らないと思うぞ
int *のtypo?
149デフォルトの名無しさん:2011/05/19(木) 13:25:41.84
int*
です
150デフォルトの名無しさん:2011/05/19(木) 20:27:22.37
std::ostringstream単体だとsprintfで可能な"%02d"とは
不可能ですよね?
151デフォルトの名無しさん:2011/05/19(木) 20:36:43.72
> std::ostringstream単体
定義よろ
152デフォルトの名無しさん:2011/05/19(木) 20:40:11.78
153デフォルトの名無しさん:2011/05/19(木) 21:03:38.58
>>150
単体ってのが何をさすのか分からんが
マニピュレータ使えばいいやん
154デフォルトの名無しさん:2011/05/19(木) 21:19:42.05
あこれです。
あったんですねどうも
155デフォルトの名無しさん:2011/05/19(木) 21:56:35.89
>>149
ならint *と保証されてる
156デフォルトの名無しさん:2011/05/19(木) 23:44:06.92
>>150
こんなのでは?

int main()
{
std::ostringstream os;

int x[] = {3, 5, 7, 9, 11, 13, 15};
const int N = sizeof(x) / sizeof(x[0]);

for (int i = 0; i < N; i++)
os << std::setw(2) << std::setfill('0') << std::right << x[i] << ' ';

std::cout << os.str() << std::endl;
}
157デフォルトの名無しさん:2011/05/21(土) 09:01:44.43
浮動小数点数出力する際に
小数点以下8桁まで表示したいけど、
123.45000000
みたいな後続のゼロは消したい。
マニピュレータで設定できる?
158デフォルトの名無しさん:2011/05/21(土) 09:46:26.94
>>157
8桁未満を切り捨てるか四捨五入するかによっても変わるんだし、自前で丸め処理したらどう?
159デフォルトの名無しさん:2011/05/21(土) 09:48:37.38
>>157
できる
160デフォルトの名無しさん:2011/05/21(土) 10:32:24.18
>>157
こんなのでは?
// 012345678901234
static char *constant = "123.12345670";
//static char constant[] = "123.45000000";
main(){
int i, len;

len = strlen(constant);
if(len < 10 || constant[len-9] != '.') return 0;
for(i=len-1; i>len-8; i--){
  printf("%d<%c>", i, constant[i]);
  if(constant[i] == '0') constant[i] = '\0';
  else break;
}
printf("\n%s\n", constant);
}
161デフォルトの名無しさん:2011/05/21(土) 11:20:13.36
>>160
マニピュレータ使いたいみたいだしこっちんほうがよくね?
#include <cmath>
#include <iomanip>
#include <iostream>
int main(void)
{
double val = 123.4567890;
int iLen = (int)std::log10(val) + 1;
std::cout << std::setprecision(iLen + 8) << std::noshowpoint << val << std::endl;
return 0;
}
整数部の桁数はsprintfなりlexcial_castしてlengthなりでも
テストして早い方を採ればいいんじゃない
162160:2011/05/21(土) 11:45:16.16
小数点以上の桁数求めて、どうする?不安
163デフォルトの名無しさん:2011/05/21(土) 15:44:54.54
C++の入出力書式は確かに面倒臭いな
いちいち本を読むかヘルプを参照しないと覚えてらんない
でもCと同じ事が出来るし自分で定義したクラスにもマニピュレータや
operator<<やoperator>>が定義出来るのがありがてえ
164デフォルトの名無しさん:2011/05/21(土) 16:58:50.88
namespaceとか使って補完が働くようにして欲しい
165デフォルトの名無しさん:2011/05/21(土) 20:29:50.22
ちょっと質問です。

CFoo foo[5];
CBar bar[5];

このように、同じ要素数の CFoo と CBar の配列があります。また、CFoo には比較演算子が定義されています。
今、std::stable_sort を使って foo を並び替えつつ、同じ並びに bar も並び替えたいのですが、なかなかいい方法が見つかりません。

例えば foo[5] に A,B,C,D,E、bar[5] に a,b,c,d,e が入っていたとして、
ソートによって foo が C,E,B,A,D と並び変わったなら同時に bar も c,e,b,a,d と並び代わっていれば成功です。

CFoo と CBar を含む新しいクラス CFooBar を作って、値をコピーして、ソートして、値を戻す、などとすればできなくはないですが、
いくらなんでも無駄が大きすぎると思いまして…。

自前でソートを書けば簡単なのですが、できれば標準アルゴリズムを使って解決したいです。
何かいい方法はないものでしょうか。
166デフォルトの名無しさん:2011/05/21(土) 20:34:50.48
pair<CFoo,CBar> foobar[2000];
を使う
167165:2011/05/21(土) 20:45:58.59
>>166
pair は思いつきませんでした。
ですがこれだと、やはり全ての値をコピーして、ソートしてからもとに戻す、と言った作業が必要でしょうか?

確かにこれなら、first のみを比較する比較関数を作っておけば使いまわせそうですし、
結果としてはやりたいことが出来ているので、代案が思いつくまではこれで行きたいと思います。
ありがとうございました。
168デフォルトの名無しさん:2011/05/21(土) 21:00:39.37
std::vector<std::pair<CFoo, CBar *> > foobarsでどうよ。つーか、実際にCBarだけの並びが必要ならダメだけど。
169デフォルトの名無しさん:2011/05/21(土) 21:35:32.43
mapが使えるならmapを使った方が手軽。
170デフォルトの名無しさん:2011/05/21(土) 21:39:49.88
速度はstd::sortが一番だな
171デフォルトの名無しさん:2011/05/21(土) 22:32:14.42
>>167
pair<T1,T2>の比較演算子はT1から比較するから、お望みの条件なら比較関数いらないよ。
172デフォルトの名無しさん:2011/05/22(日) 00:38:06.14
>165
添字の配列作ってそれを sort、アクセスする時はそれを経由すれば?

int idx[5] = { 0,1,2,3,4 };
struct Comp { bool operartor()(int n1, int n2) { return foo[n1] < foo[n2]; } };
sort(idx, idx + 5, Comp());

で、アクセスは foo[idx[i]] と bar[idx[i]] を使う。

>171
T1 が等価の時、T2 も比較しちゃうから stable 性を破壊する可能性がある。
173デフォルトの名無しさん:2011/05/22(日) 01:07:12.10
CFoo foo[5];
CBar bar[5];
なら
CFooBar foobar[5];
vector<CFooBar*> foobar;
vector<CFooBarPtr> foobar;
とかでいいじゃん
174デフォルトの名無しさん:2011/05/22(日) 04:52:59.69
>>165
http://codepad.org/xG8vs5zJ

こんな感じ?ポインタのソートしかしてないから速いよ
クラスの大きさに関係ないだろう

ポインタでなくて M が大きいとすごいコピーのオーバーヘッドが発生しそう
175デフォルトの名無しさん:2011/05/22(日) 05:18:00.99
関数オブジェクト版を書いてみた

http://codepad.org/lTtWyc90

lambda式が使えればスマートになるんだけどな
インライン展開が効けば速度が2倍近くなるかもしれない
176デフォルトの名無しさん:2011/05/22(日) 11:16:01.06
2つのイテレーターをバインドするイテレーターを作るとC++の使い手っぽく見える
177デフォルトの名無しさん:2011/05/24(火) 02:58:01.99
暇だから実体をソートするプログラムを作ってみた

http://codepad.org/DHcpe0Ta

なんでこんなにrandom_shuffle()に時間がかかるんだ?
と言うより、sort()はvector用に最適化されているのかと言いたい
内部ポインタの付け替えやってるとか?
178デフォルトの名無しさん:2011/05/24(火) 22:17:20.67
std::vector<int> a;
std::vector<int>::iterator i = a.begin();
std::vector<int>::const_iterator ci = a.begin();
これが出来て
struct Foo
{
 struct iterator{};
 struct const_iterator{};
 iterator begin(){ return iterator(); }
 const_iterator begin() const { return const_iterator(); }
};
Foo f;
Foo::iterator i = f.begin();
Foo::const_iterator ci = f.begin();//ここ
これが出来ないのは何故ですか。
179デフォルトの名無しさん:2011/05/24(火) 22:21:59.33
型が違うから
180デフォルトの名無しさん:2011/05/24(火) 22:28:38.67
vectorは何故出来るんですか
181デフォルトの名無しさん:2011/05/24(火) 22:40:43.54
>>180
返り値の型が違ってもオーバーロード出来ないぞ
type traitsをよく読め
182デフォルトの名無しさん:2011/05/24(火) 22:43:46.71
例えばこうすればコンパイルが通る
明らかに関数のオーバーロードに失敗している証拠
というか正確な関数のlookupに失敗していると言った方がいいな

struct Foo {
struct iterator{};
struct const_iterator{};
iterator begin() { return iterator(); }
const_iterator begun() const { return const_iterator(); }
};

int main()
{
Foo f;
Foo::iterator i = f.begin();
Foo::const_iterator ci = f.begun(); //ここ
}
183デフォルトの名無しさん:2011/05/24(火) 22:57:51.94
184デフォルトの名無しさん:2011/05/24(火) 23:23:04.34
operator const_iterator() { return const_iterator(); }
これで行けました。
185デフォルトの名無しさん:2011/05/25(水) 02:02:48.58
エラー E2034 const_iterator2.cpp 30: 'Foo::iterator' 型は 'Foo::const_iterator' 型に変換できない (関数 main() )

BCCは糞だな
186デフォルトの名無しさん:2011/05/25(水) 23:20:23.70
配列、繰返しの数を大きくしていくと「動作を停止しました」と出て止まるのですが原因が分かりません

具体的には
http://codepad.org/Nkh1TwRl
のコードでおよそCNTS > 530000で落ちます。

この関数自体はモンテカルロ法で自然対数の底eを返す、
 「n個の玉をn個の箱にランダムに入れるという試行で、ある箱に玉が一つも入らない確率は (1-1/n)^n。
  したがって、その試行をシミュレーションして、空の箱の相対個数を求めれば、その逆数がネピア数の推定値になる。」
というアルゴリズムです。
genrand_res53()は、0以上1未満の乱数を返します。

CNTS=520000まではメモリの使用量が大きく上がることもなく瞬時に正しい結果を出します。
コンパイラはg++4.5.2、OSはWin7(64bit)です。


なにか分かる方よろしくお願いします。
187デフォルトの名無しさん:2011/05/26(木) 01:34:44.13
>>186
スタックが怪しい

static int box[CNTS]; にしてはどうか
188デフォルトの名無しさん:2011/05/26(木) 02:13:44.75
>>186
http://codepad.org/iSGk2FuE

こんな感じでどうかな?動的に配列を確保するようにした
boostのメルセンヌツイスタを使っているので乱数の分布はいいと思う
189デフォルトの名無しさん:2011/05/26(木) 08:11:15.95
>>187
ありがとうございます
正しく動きました

>>188
如何せん初学者なものでクラスについて正しい理解が追いついていません
とりあえずコードは保存させて頂きましたので今後の勉強材料にします
ありがとうございました
190デフォルトの名無しさん:2011/05/26(木) 10:49:09.42
C++でexturnってどんな場合に使いますか?
部活の先輩のコード見てたら書いてあったんですが
よく見るexturn "C"ではなくグローバル変数のexturnです
191デフォルトの名無しさん:2011/05/26(木) 10:58:22.99
>C++でexturnってどんな場合に使いますか?
全く使いません。つーか、エラーになりますな。
192デフォルトの名無しさん:2011/05/26(木) 12:28:21.29
const変数を外部結合にするとき
193デフォルトの名無しさん:2011/05/26(木) 13:59:27.06
exturnって何?
194デフォルトの名無しさん:2011/05/26(木) 14:33:54.48
externのことだろ・・・常識的に考えて
195デフォルトの名無しさん:2011/05/26(木) 16:21:10.76
class Buffer
{
private:
 size_t size;
 void * pBuffer
};

こんな感じで取得したメモリへのポインタとサイズを保持しておくような汎用クラスって、boostライブラリにある?
196デフォルトの名無しさん:2011/05/26(木) 17:03:03.35
std::vector じゃダメなのか?

197デフォルトの名無しさん:2011/05/26(木) 17:20:28.38
std::vector だと素のポインタを使えない
198デフォルトの名無しさん:2011/05/26(木) 17:24:49.21
質問です
STLのsortで比較関数をクラス内の関数にしたいんですが、上手くいきません。
こんな感じにエラーが出ます。
http://codepad.org/mmC3c1S4
199デフォルトの名無しさん:2011/05/26(木) 17:42:34.95
>>195
ない
200デフォルトの名無しさん:2011/05/26(木) 17:49:06.24
>>198
>int Get(){ return num; }
int Get() const{ return num; }

>bool Compare( const Data &left, const Data &right );
static bool Compare( const Data &left, const Data &right );
201デフォルトの名無しさん:2011/05/26(木) 18:09:06.33
>>200
コンパイル出来ました
ありがとうございます
202デフォルトの名無しさん:2011/05/26(木) 20:19:10.78
>>198
これ確かbindとthisを組み合わせて出来なかったっけ?
叙述関数がメンバ関数の場合
203デフォルトの名無しさん:2011/05/26(木) 22:56:51.48
>199
ちくしょう、ありがとう
204デフォルトの名無しさん:2011/05/26(木) 23:04:52.45
>>191
>>193
すみませんexternです……

>>192
ありがとうございます
const変数以外は使いませんか?
先輩のコードを読みなおしたら、グローバル変数にexternを付けていました
あまり意味が無い上に良くない気がするんですが、こういう用途での使用のメリットとかあるのでしょうか?
205デフォルトの名無しさん:2011/05/26(木) 23:10:07.91
グローバル変数使うなって先輩をぶっ叩いておけ。
206デフォルトの名無しさん:2011/05/26(木) 23:14:12.84
>>202
std::sort(vec.begin(), vec.end(), boost::bind(&Test::Compare, this, _1, _2))
だな
207デフォルトの名無しさん:2011/05/26(木) 23:16:51.18
>>204
externはずしてビルドしてみたら?
208デフォルトの名無しさん:2011/05/26(木) 23:17:56.26
>>206
うんboost使うと簡単なんだけど、これC++標準のbind1stとbind2ndだけ使っても
書けないかな?binary_functionの場合無理か?
209デフォルトの名無しさん:2011/05/26(木) 23:43:28.83
>>204
なんでextern付けてんすかって先輩に聞け
210デフォルトの名無しさん:2011/05/27(金) 10:01:43.01
てんかす に見えた
211デフォルトの名無しさん:2011/05/27(金) 10:32:59.72
>>208
無理だろうな
C++03のbindはbinaryまでしか対応してない

もし可能だとすれば、まずmem_funを使ってmem_fun2_tとかを作ることになると思うがこいつはternaryだ
212デフォルトの名無しさん:2011/05/27(金) 11:00:37.65
int b;
int a = 0 ? 0 : ( b = 111, b = 222, b = 333 );

これaの値が333になるんですけど、どの環境でも同じですか?
213デフォルトの名無しさん:2011/05/27(金) 11:05:07.45
aに333代入してるんだから当然じゃね?
214デフォルトの名無しさん:2011/05/27(金) 11:29:47.87
>>212
カンマ演算子の優先順位と、operator=の戻り値がどうなるか考えれ。
それと a の初期化で0 ?ってしているから常に偽で 0 : は代入されない。
215デフォルトの名無しさん:2011/05/27(金) 12:01:19.81
>>212
どの環境でも同じです
216デフォルトの名無しさん:2011/05/27(金) 13:09:32.98
>>211
了解ありがとう
thisをbindしなければいけないのが内部にbinary_functionを作った場合の
問題だね

そうなるとternary、つまり引数を3つbindしなければいけなくなり、これはboost
もしくはtr1のbindでないと無理だ

staticにすればthisを持たない単なる関数になるので可能なわけだ
217デフォルトの名無しさん:2011/05/27(金) 21:51:23.10
テンプレートクラスのメンバ関数をインライン化しないようにするにはどうすればいいですか。
218デフォルトの名無しさん:2011/05/27(金) 22:03:13.22
template<type T>
class ClassName {
test();
}

template<type T>
void ClassName<T>::test() { }
219デフォルトの名無しさん:2011/05/28(土) 21:02:03.94
コンテナで指定の位置が存在するかどうかを調べるにはどうしてますか?

hogeで5個何かが入っているとして
6以上を指定したら-1を返す・・・みたいな

今はdequeを使ってるのですがいちいちサイズと比べているのがなんか効率悪いような気がして
220デフォルトの名無しさん:2011/05/28(土) 21:12:51.95
サイズと比較するのが普通だと思うよ

ちなみに、atメンバを使うと、範囲外のときはout_of_range例外が投げられる
221デフォルトの名無しさん:2011/05/28(土) 21:13:43.17
>>219
dequeでsizeは問題ないでしょう

あえて改良したいなら、数を問い合わせるのではなくemptyで判断するように工夫すればスッキリする
222デフォルトの名無しさん:2011/05/28(土) 21:16:15.90
うーん、そうですか。それではサイズのままにしておきます。
ありがとうございました
223デフォルトの名無しさん:2011/06/03(金) 17:31:45.97
const std::string hoge("HOGE");
的な事をしたいんですが、
クラスのコンストラクタで使うと当然問題が出てしまうんですが、
何か良い方法は無いでしょうか?
224デフォルトの名無しさん:2011/06/03(金) 17:33:47.52
問題?何が?
225デフォルトの名無しさん:2011/06/03(金) 17:38:18.10
何の問題が?
226デフォルトの名無しさん:2011/06/03(金) 17:47:28.56
一大事や・・・
227デフォルトの名無しさん:2011/06/03(金) 18:02:24.76
--
namespace hoge
{
const std::string hoge("HOGE");
}
class Fuga
{
std::string mHoge;
Fuga():mHoge(hoge::hoge){}
};
const Fuga fuga;
--
この場合、
実行するまで hogeとfugaのどちらが先に初期化されるかが未定なので、
仮にfugaが先になった場合、hoge="HOGE"を期待できないきがしました。
228デフォルトの名無しさん:2011/06/03(金) 18:19:41.49
あれ?でも、 hogeのオペレータ演算子が使えてる時点で、
hogeのコンストラクタは通ってるのか…。うーむ。

お騒がせしました。
229デフォルトの名無しさん:2011/06/03(金) 20:34:53.21
単一翻訳単位内なら上からって規格で決まってるよ
230デフォルトの名無しさん:2011/06/04(土) 14:45:39.27
test.h
std::string s;
void say();

test.cpp
void say() {
s = "say";
std::cout << s << std::cout;
}
なぜ、これは怒られるのですか?
231デフォルトの名無しさん:2011/06/04(土) 14:55:51.45
わざわざこんなところで聞かずとも、コンパイラが教えてくれてるだろうに
無視かよコンパイラが泣いてるぞ
232デフォルトの名無しさん:2011/06/04(土) 14:57:42.41
>>230
include
233デフォルトの名無しさん:2011/06/04(土) 15:11:29.34
>>231
まじかorz

>>232
ちゃんと、#include "test.h"はやっています
234 忍法帖【Lv=4,xxxP】 :2011/06/04(土) 15:15:54.77
>>233
ttp://codepad.org/fF6JOtNr
特に怒られないが
<< std::cout;は
<< std::endl;の間違いだよな?
235デフォルトの名無しさん:2011/06/04(土) 15:28:35.06
test.hを複数のcppからincludeしてて
sの定義が複数あります的なエラーが出てるのだと予想
236230:2011/06/04(土) 15:29:56.03
>>234
#include "hellow.h"
int main(int argc, char *argv[]) { say(); return 0; }
--------------------------------------------------------------------
#ifndef HELLOW_H
#define HELLOW_H
#include <string>
std::string s;
void say();
#endif // HELLOW_H
-------------------------------------------------------------------------
#include "hellow.h"
#include <iostream>
void say(){
s = "hellow";
std::cout << s << std::endl;}
こんな、コードを書いたのですが...

237!ninjya:2011/06/04(土) 15:34:06.90
>>235だったな
test.hの
std::string s;

extern std::string s;
に書き換えて
cppファイルのどれか一つに
std::string s;って書いとけ
238230:2011/06/04(土) 17:40:49.35
>>237
動きました thx

*.hに変数を定義するということは、グローバル変数を宣言するということですか?
239!ninjya:2011/06/04(土) 17:54:15.41
240230:2011/06/04(土) 19:42:19.81
>>239
他のプログラムから参照されるものだけを、*hに書けってことですね
thx
241デフォルトの名無しさん:2011/06/05(日) 08:23:29.36
つーか、C++でグローバル変数なんか使うなよ。
242デフォルトの名無しさん:2011/06/05(日) 12:20:02.10
俺がバカなだけかもしれないが
C++では#defineの代わりにconstつけたグローバル変数を使うのが普通じゃないのか?
グローバル変数使うのはだめなの?教えて>>241さん
243デフォルトの名無しさん:2011/06/05(日) 12:31:50.50
・どこか適当な名前空間の大域変数にする
・どこかのクラスの静的変数にする

あたりが落しどころかなあ。。
244デフォルトの名無しさん:2011/06/05(日) 13:06:28.50
>>242
それは変数じゃなくて定数じゃないのか?
245デフォルトの名無しさん:2011/06/05(日) 13:22:41.57
>>244
気になって調べてみたら
const~を「定数変数」って呼ぶのはあまり一般的じゃないみたいだった
さーせん
246デフォルトの名無しさん:2011/06/05(日) 13:33:26.42
グローバルクラスにしておけばいいのだろうか
247デフォルトの名無しさん:2011/06/05(日) 13:56:21.92
グローバル変数は1個も使わないな。
しかたなくシングルトンにすることはある
248デフォルトの名無しさん:2011/06/05(日) 16:29:22.26
グローバル変数に反対する人は、まずハゲを攻め落としてこい
std つけたからって本質は変わっていない
249デフォルトの名無しさん:2011/06/05(日) 16:38:18.14
C++でグローバル変数もどきを使う時はクラスのstatic変数を使うよな
他のクラスから見られるとまずい場合な
250デフォルトの名無しさん:2011/06/06(月) 17:29:09.86
namespace hoge
{
 const int BanpeiID = 0;
}

class Hoge
{
public:
 static const int BanpeiID = 0;
}

名前空間に所属する変数と、クラスに所属する変数
どっちの方がいいんだ?
251デフォルトの名無しさん:2011/06/06(月) 17:37:23.51
適切に分割したときどちらかに自然におさまるんじゃない?
どっちかが良くてどっちかが悪いというものじゃないと思うぞ
252デフォルトの名無しさん:2011/06/07(火) 17:17:25.54
すみません、質問です。

「*.lib : error LNK2001: 外部シンボル "__imp__wfopen" は未解決です。」

このようなエラーが出ます。
msvcrt.libをリンクすると出なくなるのですが今度はfreeやnewが競合します。
__imp__無しのものは既にあると思うので、これとリンクさせることは可能ですが。
253252:2011/06/07(火) 17:22:16.13
LIBファイルのエクスポート名を変える方法はありますか?
254 忍法帖【Lv=6,xxxP】 :2011/06/07(火) 17:30:29.75
ない
LoadLibraryとGetProcAdress使いなされ
255252:2011/06/07(火) 20:08:35.74
配布されているビルド済libファイルが、__imp__関数を要求するのですが。
なので、ソースの書き換えは無理なんです。
256デフォルトの名無しさん:2011/06/07(火) 20:17:56.94
wrapperdll作れ
257デフォルトの名無しさん:2011/06/07(火) 20:27:50.54
自分のソースを動的リンクでコンパイルしろよ
258252:2011/06/07(火) 20:43:40.12
MDビルドに統一します。ありがとう。
259デフォルトの名無しさん:2011/06/07(火) 22:12:33.58
FFDQ板からきますた

俺たちのプロジェクトに参加しませんか?
経験者・未経験者関係無し。やってみたい人たちが自由に参加して作っています。
野次馬歓迎、口出し歓迎、新規参加大歓迎!!

本スレ
http://yuzuru.2ch.net/test/read.cgi/ff/1298538064/l50
wiki
http://www31.atwiki.jp/fftsukurou/
チャット
ttp://fftsukurou.chat.kanichat.com/chat?roomid=fftsukurou
避難所
ttp://jbbs.livedoor.jp/game/49808/

260252:2011/06/08(水) 00:17:07.19
いろいろと試したのですが。MT(静的ビルド)にしないとエラーできます。
MT設定のままnew、deleteをMSVCRT.LIBのものを使うことは可能ですか?
261252:2011/06/08(水) 00:26:45.15
すみません。ヘッダファイルの読み込み順序を変更したらMDビルドできました。
262デフォルトの名無しさん:2011/06/08(水) 05:20:16.49
<regex>をつかった方が一文字ずつ調べるやり方よりかは
早かったりしますか?
263デフォルトの名無しさん:2011/06/08(水) 08:56:34.51
この質問にどう答えるかでそいつの力量がわかるというもの
264デフォルトの名無しさん:2011/06/08(水) 10:54:32.54
だまれカス
265デフォルトの名無しさん:2011/06/08(水) 22:25:24.88
あるVisual C++で書かれたライブラリをg++に移植したらメモリが漏れまくってます。 
調べたらデストラクタが全て空っぽでこうコメントに書かれてます。

- Nothing to do, really. All lists, array-type fields, etc, are
- handled by the compiler generated destructor. All we have to do
- is make an empty function.

Visual C++ではメンバーに他のクラスへのポインタが有る場合に自動的に
そのデストラクタが呼ばれるのですか?
266デフォルトの名無しさん:2011/06/08(水) 22:56:29.80
ンなわけないだろ
267デフォルトの名無しさん:2011/06/08(水) 23:05:36.45
どこのクソライブラリだよ
268265:2011/06/08(水) 23:27:31.00
>>266
そうですよねえ。 変だな〜と思いながらひょっとしたらそういう拡張がされてるのかな
と思って探してみたのですが見つかりません。
269デフォルトの名無しさん:2011/06/08(水) 23:33:15.19
C++/CLIだったりして
270デフォルトの名無しさん:2011/06/09(木) 14:12:55.97
c++プログラマ予備軍の脱糞太郎という者で御座います。
ここはC++相談室との事で是非とも相談をさせて頂きたいので御座いますが
お腹が空きました。
如何すれば宜しいのでしょうか。
271デフォルトの名無しさん:2011/06/09(木) 14:59:27.21
死ね。
272デフォルトの名無しさん:2011/06/09(木) 15:01:45.89
右手でも食ってろ
273デフォルトの名無しさん:2011/06/09(木) 19:11:05.47
どんな型でも受け取って、表示可能な関数の作り方をおしえてください。
PHPのprint_rのようなのがあると便利です。
自作変数すべては大変とおもうのでSTLまで変数でいいのですが。
274273:2011/06/09(木) 19:18:20.03
boostのanyで受け取って、そのあとどうしたらいいですか?
275デフォルトの名無しさん:2011/06/09(木) 19:31:51.98
boost::shared_ptrはなぜ0の代入が定義されていないんですか
276デフォルトの名無しさん:2011/06/09(木) 20:29:18.35
>>273
そいうのは、テンプレートの方がいいんじゃ無いかな?
277273:2011/06/09(木) 20:34:29.13
>>276
サンクス
278デフォルトの名無しさん:2011/06/09(木) 21:29:36.85
お世話になります

線形代数の、例えばベクトル演算のようなことを構造体(クラスでも良いのでしょうが)と
演算子のオーバーロードで簡易に表記できるようなシステムを作りたいです。
演算子のオーバーロードについて勉強中なのですが、例えば
Vector v;
int x://or double, float,...
などと適当に定義して
x*v
を線形代数のようなベクトルをx倍にさせるような演算子*を定義することは出来ますか?
v*xなら*をVectorのオーバーロード関数として定義すればよいですが
逆は*をintのオーバーロード関数とせねばならず不可能・・・?
279デフォルトの名無しさん:2011/06/09(木) 21:36:15.87
>>278
忘れ去られたSTLであるValarrayを使うと簡単に出来るんじゃねーの
280デフォルトの名無しさん:2011/06/09(木) 21:36:22.94
まず発想からおかしい
281デフォルトの名無しさん:2011/06/09(木) 21:47:14.07
>>278
Vector operator*(int, const Vector&);
をクラス外で定義
282デフォルトの名無しさん:2011/06/09(木) 21:53:51.63
>>279
似たようなことが出来るSTLがあるのですね
STL自体使ったことがありませんが使えそうになったときのために記憶にとどめておきます。

>>280
演算子のオーバーロードを知ったときこれだ!と思って飛びついたのですが、おかしかったですかね?

>>281
それでよいのですか
わかりました。

すばやいご返答ありがとうございました。
283デフォルトの名無しさん:2011/06/09(木) 21:59:40.03
VC++のフォームアプリケーションでメニューバーをつけたいのですが
MenuStripを配置したところ通常のメニューとは違うデザインになりました
普通のデザインにするにはどうしたらいいの?
284デフォルトの名無しさん:2011/06/09(木) 22:41:51.92
1. #include "Hoge.h"
2. #include <stdio.h>

「"」形式と「<>」形式のインクルードはどっちを先に記述するべき?
285デフォルトの名無しさん:2011/06/09(木) 22:47:48.55
どっちでもいいだろ。
自作ヘッダが先のほうがエラーが見つけやすいと思うが。
286デフォルトの名無しさん:2011/06/09(木) 23:00:17.09
>>285
やっぱりそうなのか?
今まで何も考えずに標準ヘッダを先に書いていたんだけど、自作を先に書かないとインクルードのミスが見つけられないんだよね
287デフォルトの名無しさん:2011/06/09(木) 23:06:52.31
メンバ関数のメモリ消費ってインスタンスの数に依存しますか?
288デフォルトの名無しさん:2011/06/09(木) 23:38:10.67
>>278
線形代数のライブラリって、boostの中にもあったような気がするから、
確認してみるといいかも。
289デフォルトの名無しさん:2011/06/09(木) 23:42:16.38
>>286
一方私はより標準的なものから並べている。例えば、
<stdio.h>
<unistd.h>
<fftw3.h>
"product.h"
"MyApp.h"
の順。
290デフォルトの名無しさん:2011/06/09(木) 23:51:07.41
それだと、"product.h"が不完全でも、エラー無しで通ってしまうことがある。
291デフォルトの名無しさん:2011/06/09(木) 23:53:46.98
>dir/foo.cc の主たる目的が dir2/foo2.h にあるものを実装もしくはテストすることであれば、dir/foo.cc では次の順序でヘッダをインクルードする。

>1 dir2/foo2.h (適切なところ ? 詳しくは下を参照)。
>2 Cシステムファイル
>3 C++システムファイル
>4 その他ライブラリの .h ファイル
>5 プロジェクトの .h ファイル

googleさんはこうしてるみたい
292デフォルトの名無しさん:2011/06/10(金) 00:00:14.89
293デフォルトの名無しさん:2011/06/10(金) 02:07:30.00
現状、こんな感じでインクルードしてる
google のガイドラインと同じなんだよね

<stdio.h> ←C
<string> ←C++
<boost/shared_ptr.hpp> ←その他ライブラリ
"Hoge.h" ←このプロジェクトのもの

ただこの方法も前述の問題があるんだよね・・・
294デフォルトの名無しさん:2011/06/10(金) 02:48:36.91
別にエラー出たらその時点で直せばいいから問題とは思わないな。
295デフォルトの名無しさん:2011/06/10(金) 07:26:58.85
俺は>>291の 2 と 3 が逆だな。特に意識してなかったが C 先の方がいいのかな?
296デフォルトの名無しさん:2011/06/10(金) 07:40:42.14
ローカルなほど下にインクルードかな
std
3rdlib
mylib
app
297デフォルトの名無しさん:2011/06/10(金) 09:20:27.37
Foo.hを実装するFoo.cppの場合
"Foo.h" を1行目に書いて後は>>295と同じ
298デフォルトの名無しさん:2011/06/10(金) 09:22:08.35
忘れてくれ
299デフォルトの名無しさん:2011/06/10(金) 11:09:59.65
俺も>>297と同じことしてるな
300デフォルトの名無しさん:2011/06/10(金) 14:38:28.08
プレイスメントニューを使うと初期化しなくて良いと聞きました。
詳しく教えてください。
301デフォルトの名無しさん:2011/06/10(金) 15:42:35.59
struct A{
struct B{ int x;} moo;
} foo;
とある場合,メンバのメンバのポインタの取得はできますか?
&A::B::xでも&A::moo::xでもおかしいですよね...
あまりやりたくないですがreinterpret_castして足すしかないのでしょうか.
302 忍法帖【Lv=8,xxxP】 :2011/06/10(金) 15:47:59.43
&foo.moo.xじゃないの?
303デフォルトの名無しさん:2011/06/10(金) 15:54:40.57
int *p1 = &foo.moo.x;
A::B *p2 = &foo.moo;

こういうこと?
304デフォルトの名無しさん:2011/06/10(金) 15:55:59.64
>> 302
メンバポインタ的なオフセットが知りたいのです.
イメージ的には &foo.moo.x - &fooなんですが...
&foo.moo.xだと,xのアドレスになりますよね?
305デフォルトの名無しさん:2011/06/10(金) 16:15:39.71
>> 303
そうなんですが,
A::moo::x *p = &foo.moo.x;
みたいに,メンバのメンバへのポインタが取りたいのです…型安全に.
タプルみたいなものを使わないと無理でしょうか?
306301:2011/06/10(金) 16:27:06.18
305の最後は忘れてください.
構造体のネストだと無理かなーと思っただけです.
やはり整数にreinterpret_castして引き算…でしょうか…
そもそもこんなことが必要なのも問題なんですよね…
307デフォルトの名無しさん:2011/06/10(金) 16:34:19.51
普通こんな使い方するんじゃね?

struct A {
struct B {
int x;
} moo;
} foo;

int main()
{
A::B *b = new A::B;
int A::B::*xx = &A::B::x;
b->*xx = 2;
std::cout << b->*xx << std::endl;
delete b;
}
308デフォルトの名無しさん:2011/06/10(金) 16:38:16.90
>>301
int A::B::*p = &A::B::x;
309デフォルトの名無しさん:2011/06/10(金) 16:54:39.58
>>301
int A::B::*p = &A::B::x;
でいい。foo.mooのメンバにアクセスしたいなら
foo.moo.*p
とすればいい
310デフォルトの名無しさん:2011/06/10(金) 16:56:49.04
こういうのは叱られるな
どうすればいいのかな

struct A {
struct B {
int x;
} moo;
} foo;

int main()
{
A f;
int A::B::*xx = &A::B::x;

f.B::*xx = 3;
std::cout << f.B::*xx << std::endl;
}
311デフォルトの名無しさん:2011/06/10(金) 17:01:54.88
これなら動くわ
どうなってるんだ

#include <iostream>

struct A {
struct B {
int x;
} moo;
} foo;

int main()
{
A f;
int A::B::*xx = &A::B::x;

f.moo.*xx = 3;
std::cout << f.moo.*xx << std::endl;
}
312デフォルトの名無しさん:2011/06/10(金) 17:27:26.21
>>311
どうなってるも何もそれで正しいよ。オブジェクトの模式図を紙に書いて確認してみなよ

しかしこれでreinterpret_castしてオフセット計算しようとかマジ恐ろしい野郎だな
313デフォルトの名無しさん:2011/06/10(金) 17:28:33.30
>>312
いや、もしmooが宣言されてなかったらどう書くかって話
314301:2011/06/10(金) 18:19:02.65
>>307 >>308 >>309
なるほど,理解できました.なるほど納得です.勉強になりました.

そして私は大きな間違いをしていました.やりたかったのは,
struct B{ int x; };
struct A{ B foo; };
のときですね...
&A::fooは取得できるんですが,A::B::xではとれません…
計算はできても良さそうなのですが…
ひょっとしてこの場合も同じようになるのでしょうか?
315301:2011/06/10(金) 18:21:10.40
>> 312
まったくもって…ですね
reinterpret_castは基本的に使うなってのはわかっているのですが,
他に解決策もわからず,お尋ねしています…
316デフォルトの名無しさん:2011/06/10(金) 18:33:46.84
>>314
もしかしてやりたいのはこういうことか?
struct B{ int x; };
struct A{ B foo; };

A::B A::*p = &A::foo;
int B::*q = &B::x;

A a;
a.*p.*q = 42;
317301:2011/06/10(金) 18:36:31.11
しまった…混乱してますね.先ほどと名前を一致させると
st. B{int x;}; st. A{ B moo; };
A foo;
のときに,foo.moo.xへのメンバポインタがほしいわけです.
やりたいイメージとしては,同じく,
int <何かしらの型>* p = &A::moo::x; ...みたいなのですが...
右辺が明らかにおかしいです...
318301:2011/06/10(金) 18:39:04.30
>> 316
そうそう!そういうことなんです.
それを,一発でできないのかなぁと…
静的に決まるので,計算できるんなら取れてもいいのに,と思いまして…
319デフォルトの名無しさん:2011/06/10(金) 18:52:45.92
>>318
そりゃムリだと思うなー
B A::*とint B::*を持つ、Aをとってintを返す関数オブジェクトを作るってのがやりたいことに近そう
320301:2011/06/10(金) 19:05:01.75
>> 319
なるほど.了解です.簡単にできるように
ちょっと頑張ってみます.ありがとうございました.
321デフォルトの名無しさん:2011/06/11(土) 13:02:55.63

namespace hoge { namespace fuga { namespace piyo { namespace impl {
template <class t> struct x { /* ... */ } ;
}}}}

template <class t> struct x {
typedef hoge::fuga::piyo::impl::x<t> type ;
} ;

template <class t> void f(typename x<t>::type const & ) { /* ... */ }

int main(void) {
x<char>::type c;
x<short>::type s;
x<long>::type l;

f(c);
f(s);
f(l);

return 0 ;
}


上のように〜::typeを引数にするとlookupが働かないみたいなんですが
これをうまく動かせる簡単な方法はありますか?
322デフォルトの名無しさん:2011/06/11(土) 14:52:23.45
istringstream str("20 31 345 -50 109 8");
istream_iterator<int> first(str), second, last;

while (first != last){
cout<< *first <<endl;
++first;
}

で一応、正常に整数が出力されているようですが、
while (first != last)の条件でどうしてうまくいくのか
わかりません。Iterator last にはstrの終了情報は渡って
いないように思うのですが。
323デフォルトの名無しさん:2011/06/11(土) 15:12:20.69
>>322
++firstでもう何もないend的なところに移動したイテレータと、デフォルトコンストラクタで初期化されたイテレータがイコールになるようにoperator==が定義されてる
324デフォルトの名無しさん:2011/06/11(土) 17:03:49.39
ありがとうございます。

strから取り出すものがなくてfirstが0 (あるいは、end()に相当するもの)
を返すのと、最初から何もstrみたいな文字列をもってなくて0を返すものが
等しくなって終了しているのではないかと、質問した後で思いついたのです
が、そう間違っていないようですね。

しかし、なかなか凝ってますよね。
325デフォルトの名無しさん:2011/06/11(土) 17:33:25.38
その動作って保証されてたっけ
326デフォルトの名無しさん:2011/06/11(土) 17:41:24.04
されてる
327デフォルトの名無しさん:2011/06/11(土) 19:10:06.60
>>321
f<char>(c);
f<short>(s);
f<long>(l);

仕様書 14.8.2.4 段落 4
導出の対象外
 修飾付き識別子に指定された、型を示す入れ子名前指定子
に該当して、型実引数が導出できないのでは?
328デフォルトの名無しさん:2011/06/11(土) 23:13:43.23
std::setから条件に一致するすべての要素を巡回するイテレータみたいなものを取得することは出来ますか?
329デフォルトの名無しさん:2011/06/11(土) 23:19:00.99
find_ifで
330デフォルトの名無しさん:2011/06/12(日) 00:49:10.54
>>328
boost::filter_iterator
331デフォルトの名無しさん:2011/06/12(日) 10:55:55.89
複素数と整数の演算は定義されていません。例えば、

complex<double> z(1.0,1.0);
cout<< 2 * z << endl;

はエラーになります。double型との演算は定義されているため

cout<< 2.0 * z <<endl;

としなければなりません。しかし、2*zとかz/3のような演算もやりたいです。

整数と複素数の演算をオーバーロードすればいいのですが、暗黙の型変換
演算子(これってクラスの時しか使えない?)やtrait(typedefテンプレート)
を使って対応できないものでしょうか?
332デフォルトの名無しさん:2011/06/12(日) 12:20:00.79
>>331
std::floor()とかstd::ceilを使って小数点以下を切り捨てるか切り上げたらだめなん?
それかstatic_cast<double>を使うとか

だいたいstd::complex<type>なんだから、整数の複素数でいいならstd::complex<int>とすればいいし
要するに小数点以下の扱いをどうしたいかによって変わって来る
333デフォルトの名無しさん:2011/06/12(日) 12:21:33.40
もっともstd::complex<int>じゃあ除算は正確に定義出来ないだろうね
334 忍法帖【Lv=4,xxxP】 :2011/06/12(日) 16:39:26.45
double(2) * z
335デフォルトの名無しさん:2011/06/12(日) 17:07:14.21
やっぱり、素直に整数と複素数の演算子をオーバーロードした
方が簡単だと思いました。
336デフォルトの名無しさん:2011/06/12(日) 17:25:58.94
演算子のオーバーロードなんてしなくていいよ
337デフォルトの名無しさん:2011/06/12(日) 17:34:00.13
>>335
intが先に来る場合はintは基本型だからメンバ関数を持てないだろ

int.operator(complex)ってのは無理だからね

operator*(int, complex) を定義するにしてもcomplexを改変しなければならないし
まあfriendにしなくてもintを内部でdoubleにキャストするだけなら必要無いよこんなの
338デフォルトの名無しさん:2011/06/12(日) 18:09:39.53
>>337
>必要無いよこんなの

※ 個人の感想です。
339デフォルトの名無しさん:2011/06/12(日) 18:24:29.62
いや、intが先だとか。後だとかというレベルの問題じゃないんだけどね。

まぁ、データメンバかメンバ関数でそういうのがあった気がするけど、
忘れたw。
340デフォルトの名無しさん:2011/06/12(日) 18:40:05.31
>>337

確かに、メンバ関数が先か、どうかの話もないではあいが。。。

残念ながら、完全にピントがずれてる。
341デフォルトの名無しさん:2011/06/12(日) 18:49:33.06
stdに勝手にへんなオペレーター追加とか犯罪レベルの愚行ですよ
342デフォルトの名無しさん:2011/06/12(日) 19:16:40.51
const int size = 5;

template <class X> class art{
X a[size];
public:
X &operator[](int i);
};

template <class X> X &art<X>::operator[](int i){
try{
if(i < 0 || i > size - 1) throw 1;
}catch(int i){
cout << "エラー\n";
return 0;
}
return a[i]; //エラー
}

汎用安全配列を作っているのですが、戻り値の型が違うと怒られます
テンプレートでなければこれで通ると思うのですが、なにか違いがあるのでしょうか?
343デフォルトの名無しさん:2011/06/12(日) 19:20:45.29
なんでエラーメッセージを貼らないの?
344デフォルトの名無しさん:2011/06/12(日) 19:43:34.97
すみません、これです

1>d:\project\演習用\main.cpp(17): error C2440: 'return' : 'int' から 'int &' に変換できません。
1> d:\project\演習用\main.cpp(12): クラス テンプレート のメンバー関数 'int &art<X>::operator [](int)' のコンパイル中
1> with
1> [
1> X=int
1> ]
1> d:\project\演習用\main.cpp(23) : コンパイルされたクラスの テンプレート のインスタンス化 'art<X>' の参照を確認してください
1> with
1> [
1> X=int
1> ]
345デフォルトの名無しさん:2011/06/12(日) 19:55:17.60
エラー箇所はそこじゃなく return 0; じゃね?
346デフォルトの名無しさん:2011/06/12(日) 19:59:40.49
参照なのに0を返すのはおかしい
347デフォルトの名無しさん:2011/06/12(日) 20:13:45.33
群馬県高崎市に住む39歳AB型、製造業界で派遣プログラマーの仕事をしているhekenekoこと、黒飛健と申します。
新日本テクトスという会社を追われ、その後どうしてよいかわからなくなりました。
だけど私の大好きな尾崎豊の歌に励まされ、夢であるプロのクリエイターを目指すことにしました。
何度も挫けそうになりましたが、尾崎豊の歌を聞きながら自分を励ましています。
今も尾崎豊の歌のおかげで、夢を諦めずにCGアニメの製作を続けられています。

とりあえず、以下の動画を見てください。一生懸命作ったもので、自分では既にプロレベルの傑作だと思ってます。
できればみなさんのご意見、ご感想を聞きたいです。

復興支援アニメ.mp4
http://www.youtube.com/watch?v=yn4uTiN8vvM

湾岸鉄道キャンペーンCM(カラー).mp4
http://www.youtube.com/watch?v=g3PlX1OAhug&feature=channel_video_title


これは力作で、にしおかすみこさんにも是非見てもらいたかったため彼女のブログにコメントしたんですが無視されました。
http://blog.watanabepro.co.jp/nishiokasumiko/archives/2008/02/22_15_post_22.html
(下の方にあります。投稿者: hekeneko | 2008年03月24日 22:54)
やはり私の才能に気づいてくれる人は中々いないみたいですね(苦笑)。


題名”ラダニアムの翼”
A wing of radaniam_partU.mp4
http://www.youtube.com/watch?v=keSK70uqDJY
A wing of radaniamu part_V.mp4
http://www.youtube.com/watch?v=-LRZbXbirR0

題名”hekeneko honey”
http://www.youtube.com/watch?v=kATwf6fAkG8
私の世界観の全てを凝縮した力作です。hekenekoワールドをご堪能あれ。
348デフォルトの名無しさん:2011/06/12(日) 20:18:02.40
return 0;を消して、正常動作を確認しました
エラーメッセージの雰囲気で早とちりして、行をちゃんと数えなかったのが原因と思われます
ありがとうございました
349デフォルトの名無しさん:2011/06/12(日) 20:25:02.34
>return 0;を消して、正常動作を確認しました
おまw
350348:2011/06/12(日) 20:43:53.61
>>349
ですよね…

サンプルとか説明で積んだ知識だと「exit(1);」で逃げられそうなんですけど、
returnで上手く収める方法ってありますか?
351デフォルトの名無しさん:2011/06/12(日) 20:44:52.32
assertで止めろ
352デフォルトの名無しさん:2011/06/12(日) 20:46:58.90
例外握りつぶさずに、ちゃんと上に投げろよ
353デフォルトの名無しさん:2011/06/12(日) 20:49:18.39
throw std::out_of_range
354デフォルトの名無しさん:2011/06/12(日) 20:54:21.19
domain_error
out_of_range
invalid_argument
range_error
length_error
使い分けがいまいちわからない
355デフォルトの名無しさん:2011/06/12(日) 20:58:09.85
std::vectorはoperator[]で例外なんて投げないけどな
356デフォルトの名無しさん:2011/06/12(日) 21:02:31.08
atは投げるけど二つ作るのがいいんかね
357デフォルトの名無しさん:2011/06/12(日) 21:04:10.53
用途によるけど自分で使うだけなら、
atなんてどうせめんどくさがって使わないと思うがな
358348:2011/06/12(日) 21:07:54.39
全く分からないので、もっと勉強してきます…
初めてのプログラミングにc++を選んだドM野郎なので
地道にやれば…いつか必ず…!
359デフォルトの名無しさん:2011/06/12(日) 21:10:49.30
C++なんて優しい方だろ
perlとかコードに目を通すだけでも目痛くなるぞ
360デフォルトの名無しさん:2011/06/12(日) 21:34:11.92
そういうコードばっか選んで見てるからだろ
361デフォルトの名無しさん:2011/06/12(日) 21:41:18.10
>>359
言語仕様が難しいことととコードリーダビリティが悪いことを一緒にしてどうするよ。
362デフォルトの名無しさん:2011/06/12(日) 22:20:42.27
>>348
つーか、行番号が表示されるエディタを使えよ。
カーソルのある行番号が表示されるだけでいいから。
363デフォルトの名無しさん:2011/06/12(日) 22:33:56.49
メモ帳ですら行が分かるというのに
364デフォルトの名無しさん:2011/06/12(日) 22:43:05.60
VC++ってなんでデフォで行番号表示されてないんだろうな
365デフォルトの名無しさん:2011/06/12(日) 23:14:53.52
表示されてなくてもあんまり困らないからじゃないの
366デフォルトの名無しさん:2011/06/13(月) 00:09:38.75
C++0xの本ってないのかね?
367デフォルトの名無しさん:2011/06/13(月) 00:17:05.27
>>366
まだ規格も固まってないのに版起こしたら後からの修正が面倒だろ
今はPDFで印刷屋に持って行けばいいので楽にはなったけどな
368デフォルトの名無しさん:2011/06/13(月) 01:50:02.11
そのくせ、エラーには行番号表示するんだよな。
369デフォルトの名無しさん:2011/06/13(月) 09:03:16.90
>>367
いやそういう問題ではない
規格改訂がある度に出版社は不良在庫と返品の山を抱えるリスクがある
そのため規格がはっきり決定するまで危なくて出版出来ないのだ
損するだけだからね
370デフォルトの名無しさん:2011/06/13(月) 09:36:24.84
0xの本書くのでお金くださいって乞食とかいたよねぇ
371デフォルトの名無しさん:2011/06/13(月) 12:58:13.30
つまり>>367は正しいな
372デフォルトの名無しさん:2011/06/13(月) 20:48:55.33
ヘッダファイルで、OBJが生成されていなかったら生成する分岐をさせることは可能ですか?
373デフォルトの名無しさん:2011/06/13(月) 20:53:50.10
コンパイルしたことないの?
374デフォルトの名無しさん:2011/06/13(月) 21:03:04.66
>>372
Makefileを使うといいよ
375デフォルトの名無しさん:2011/06/13(月) 23:42:13.33
typedef int& RefInt;
int i;
RefInt& ri = i;

riは参照の参照になってコンパイルエラーになると思ったのですがなりませんでした。
なぜでしょうか?
376デフォルトの名無しさん:2011/06/13(月) 23:48:58.00
>>375
コンパイラは何よ
&&になって右辺値参照になってるんじゃないか?
377デフォルトの名無しさん:2011/06/14(火) 00:03:29.61
ある公開されているソースコードをVisual stidioでなんとか見よう見まねで改変してビルドしたはいいんだが、
exeファイルとobjやマニフェストがまとまらずに単一のexeにならないんだが・・・
378デフォルトの名無しさん:2011/06/14(火) 00:21:04.76
>>375
C++0xだと通るみたいだな
下のプログラムで、rの型がint &になるのと同じ感じなのかな?

template <typename T>
void hoge(int x)
{
T &r = x;
}

int main()
{
hoge<int &>(23);
}
379デフォルトの名無しさん:2011/06/14(火) 00:29:49.87
C++0xではtypedef、テンプレート引数、decltypeで参照型が現れたとき
その型への参照はただの参照つまり元の型のままになる
380デフォルトの名無しさん:2011/06/14(火) 00:49:29.07
template< T& > F;
F< int& > f;

たまらんちん
381デフォルトの名無しさん:2011/06/14(火) 07:10:49.51
おはようございます
お世話になります。

struct A{
double x;
double f();
}

struct B:A{
}

double A::f(){
return x;
}

このような構造体の継承を行い、main関数内で
A* a;
a->f();
とするとエラー番号C2662が出てきてコンパイルができません
少し調べてみるとconst関数がどうのこうの出てきましたがconstなど使っていないので
なぜconst関数の話題になるのか謎です
エラーの原理と解消方法を解説いただけないでしょうか
よろしくお願いいたします。
382381:2011/06/14(火) 07:16:59.11
>>381です。大失態をしていたようです。
とりあえず>>381は無視してください
スレ汚し大変失礼いたしました
383381:2011/06/14(火) 07:42:07.62
たびたび申し訳ありません
やはり>>381でもエラーが出るようです(一時他の場所でエラーが出ていたものと思いました)
とりあえず関数f()の後ろにconstをつければ回避できることは分かりましたが、未だに原理が理解できません。
どなたかお手すきの方で解説、あるいは解説があるサイトなどご紹介していただけるとありがたいです。
384デフォルトの名無しさん:2011/06/14(火) 07:46:30.12
Bの存在理由が分からないw
385デフォルトの名無しさん:2011/06/14(火) 07:48:47.64
言いたいことは分かるが情報の小出しが多そうなのでさっさとhttp://ideone.com/使って再現コード張れ
386デフォルトの名無しさん:2011/06/14(火) 08:11:25.42
>>381
エラーなんて出ないぞ
http://ideone.com/jQwRU
情報が足りなくて指摘もできん
387デフォルトの名無しさん:2011/06/14(火) 08:23:02.12
お前やさしい上にエスパーなんだなw
388デフォルトの名無しさん:2011/06/14(火) 08:40:42.03
申し訳ありません、原因が判明いたしました

まず訂正です
>>381
中、
A* a;
とあるのは
B* b;
でした

で、実は>>381のmain関数内で、とありますが、実はさらに関数の中で呼び出しており、
その関数の引数が const B*だった、ということでした
ここのconstをはずせばコンパイルできました。

お付き合いいただいたのにこんなオチで申し訳ありません
389デフォルトの名無しさん:2011/06/14(火) 08:46:24.90
質問するときは正確に言え
というかconst外せばコンパイル通ったとか、const付けてる意味考えろ
390デフォルトの名無しさん:2011/06/14(火) 09:02:37.33
はい、お手数をかけさせて申し訳ありません・・・

迷惑ついでにお付き合いください
以下、サンプルコードを貼り付けました
http://ideone.com/peJ2E

struct Vの中でoperator+を定義し、
さらに関数fの引数がconst V* aであり、
fのなかで(*a)+という形を使っております。
すると上と似たようにconst の有るなしでコンパイルが通りません。
f内部でconstなしV型変数に置き換えるか、Vの外でconst V& + const V&のようなoperator+を定義すると
回避できますが、
struct Vの中でさらにoperator+をオーバーロードし回避するような方法はありますか?
391デフォルトの名無しさん:2011/06/14(火) 09:19:21.26
constの意味と使い方を勉強しなおせ
http://ideone.com/5famS
392デフォルトの名無しさん:2011/06/14(火) 09:26:57.05
意味は理解しているつもりです。
文法的な部分での理解が足りないかもしれません。
(いまだ関数の後ろにconstと書かれると?と思ってしまいます)

ありがとうございました。
勉強・精進致してまいります。
393デフォルトの名無しさん:2011/06/14(火) 09:30:22.70
>>392
メンバ関数後のconstはオブジェクト内部を変更しないという表明
これをしてないとconstなオブジェクトからはメンバ関数を呼び出せない
内部を変更してしまう可能性があるから
394デフォルトの名無しさん:2011/06/14(火) 09:36:30.00
>>393
なるほど
すると関数の後にconstがくる場合はclass(struct)内での関数のみということでしょうか
理解できてきた気がします
395 忍法帖【Lv=5,xxxP】 :2011/06/14(火) 09:47:27.34
理解できてね〜w
396デフォルトの名無しさん:2011/06/14(火) 10:07:50.32
>>394
理解できてないよ・・・ class内のみのメンバ関数はprivateだろ
オブジェクト指向そのものの理解が足りてなさそうだから基礎から勉強しな
397デフォルトの名無しさん:2011/06/14(火) 10:20:37.43
ここでいろいろ尋ねる前に自分で学ぶべきことがあったようです。
痛感いたしました。。。
失礼いたします。ここまでご指摘ありがとうございました。
398デフォルトの名無しさん:2011/06/14(火) 11:06:51.74
>>397
死ね
399デフォルトの名無しさん:2011/06/14(火) 11:41:12.15
>>398
お前が死ね
400デフォルトの名無しさん:2011/06/14(火) 14:06:02.66
式の中のインクリメントは最適化にもよって何時実行されるか保障されてないって本当ですか?
401デフォルトの名無しさん:2011/06/14(火) 14:14:45.88
>>400
それは違う
演算子の評価順序に従う
しかし副作用完了点までのいつインクリメントされるかまでは保証されていない

例外は関数の呼び出し
カンマ演算子ではないので評価順序が規定されていない
402 忍法帖【Lv=5,xxxP】 :2011/06/14(火) 14:27:46.34
結果は保証されるけど、タイミングまでは保証されないだろ。
403デフォルトの名無しさん:2011/06/14(火) 14:36:48.44
ありがとうございます。
じゃあ副作用完了点というやつのまでにインクリメントしたやつを2回使わなければ良いということですか?
副作用完了点とは何時ですか?
404デフォルトの名無しさん:2011/06/14(火) 15:17:57.87
>>403
ググれ
405デフォルトの名無しさん:2011/06/14(火) 16:49:30.96
>>403
たとえば

a[i] = i++;

このような式の場合副作用完了点はセミコロンの直前にある
つまりセミコロンの直前まで実行が終了して始めてiがインクリメント
されている事が保証されているだけで、iがいつどのタイミングで
インクリメントされるかまでは規定されていない

したがってa[i]に入るのは何か、はたまたa[i]のiはインクリメントされる
前のiなのかインクリメントされた後のiなのか、全然予測出来ない

このような場合C89以降のCでは単項演算子が付いた評価されるべき
iのような同一のオブジェクトが2回以上現れた時の動作は未定義としている
つまり鼻から悪魔だ
406デフォルトの名無しさん:2011/06/14(火) 19:54:15.33
くだらん
407デフォルトの名無しさん:2011/06/14(火) 20:54:56.39
406 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん

NGワードにいれたからすっきり
408デフォルトの名無しさん:2011/06/14(火) 21:50:04.58
407=403
409デフォルトの名無しさん:2011/06/14(火) 21:51:25.56
◆QZaw55cn4cって糞だよなぁ
410 忍法帖【Lv=5,xxxP】 :2011/06/14(火) 21:53:15.60
>>407
>NGワードにいれたからすっきり
そいつはよかった。実にくだらんがな。
411デフォルトの名無しさん:2011/06/14(火) 21:58:27.89
410 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
412デフォルトの名無しさん:2011/06/15(水) 00:53:55.72
C/C++言語のファイルコピーのソースコードで
linuxとwindowsで動きタイムスタンプもコピーできるものはありますか。
413デフォルトの名無しさん:2011/06/15(水) 01:29:35.96
つboost
414デフォルトの名無しさん:2011/06/15(水) 09:10:32.38
>>411みたいな
「おれはお前をNGにした証拠」的なレスって

惨めだよね
415デフォルトの名無しさん:2011/06/15(水) 10:10:16.31
「おれはお前をNGにした証拠」
416デフォルトの名無しさん:2011/06/15(水) 12:07:09.90
>>414
悔しそう
417デフォルトの名無しさん:2011/06/15(水) 14:02:04.21
>>414
そうだな、悔しいよな
418デフォルトの名無しさん:2011/06/15(水) 14:07:43.84
C++の質問には、難癖つける癖に
安易な突っ込み所にはすぐレスるのなwww
419デフォルトの名無しさん:2011/06/15(水) 14:42:47.40
>>414
サイヤ人の仲間が殺されたのが悔しいんじゃねえんだろ
フリーザにいいようにされちまったのが悔しくてしょうがねえんだよな
420デフォルトの名無しさん:2011/06/15(水) 18:59:06.73
ここまでC++の自演
421デフォルトの名無しさん:2011/06/15(水) 23:23:43.57
とりあえず、「惨めだよね」とか書き込んだり
「悔しそう」とか書きこむのは

 平 日 の 昼 間

はやめたほうがいいよ…ほんと、マジで。
422デフォルトの名無しさん:2011/06/16(木) 00:42:18.61
その無駄スペースもやめたほうがいいよ、マジで
423デフォルトの名無しさん:2011/06/16(木) 00:44:18.72
携帯持ってないおっさんが>>421書いてると思うと…
424デフォルトの名無しさん:2011/06/16(木) 00:45:01.21
「平日の昼間」という文字列に反応するニートども
425デフォルトの名無しさん:2011/06/16(木) 01:49:46.19
昼休みが存在する事もしらないニート
426デフォルトの名無しさん:2011/06/16(木) 02:08:07.23
昼休みに2chやってるニート
427デフォルトの名無しさん:2011/06/16(木) 13:13:53.56
C++ 6.0 のADOを使用した処理で質問があります。

現在SQL SERVERに接続し、データを取得しています。
この時

_variant_t varValue;
varValue = rs->Fields->GetItem(_variant_t("TargetDate"))->Value;

このようにデータを取得してきているのですが
DB側がIntegerの値を返すとvarValue はVT_I4となりvarValue.intValで値が取得できるのですが、
DateTime型の場合varValue はVT_BSTRになります。
この時、何かの型の変数に格納する場合、どのような型が適切でどのようにキャストしてやればいいのでしょうか?
ウォッチしたときに varValueは"2011-01-01" BSTR と表示されます。この値を取得して使用したいのです。

よろしくお願いします。
428デフォルトの名無しさん:2011/06/16(木) 15:23:15.55
429デフォルトの名無しさん:2011/06/16(木) 15:36:49.34
>>428
誘導ありがとうございます。
そちらできいてみます。
430デフォルトの名無しさん:2011/06/16(木) 20:43:03.03
この場合Lをつけてもつけなくてもどっちでもいけるけども
どっちでもいいもの?

wchar_t a=L'a';
wchar_t a='a';
431デフォルトの名無しさん:2011/06/16(木) 21:36:18.16
単に型変換が起こるだけだが、
統一するためにLはつけるべきでは
432デフォルトの名無しさん:2011/06/18(土) 22:05:49.81
int a;
new( &a ) int;

これは変数aに対して何か動作をしてるんですか?
433デフォルトの名無しさん:2011/06/18(土) 22:29:27.07
一般的にはplacement newだけどな。
intのしかも自動変数で何をしたいかは自分には想像出来ないが。
434デフォルトの名無しさん:2011/06/18(土) 22:34:33.87
動作を知るためのコードで、する理由は無いです
435デフォルトの名無しさん:2011/06/18(土) 23:38:05.55
>>401
初期化子のカンマは副作用完了点なの?
436デフォルトの名無しさん:2011/06/19(日) 00:28:46.62
>>432
クラスならコンストラクタ呼び出し
437デフォルトの名無しさん:2011/06/19(日) 00:30:16.53
>>436
int型の話をしてるんです。
438デフォルトの名無しさん:2011/06/19(日) 09:08:33.53
ggrks
439デフォルトの名無しさん:2011/06/19(日) 13:31:25.31
なんもしとらんね。
初期化値のない場合、POD型はデフォルト値、
つまりなにもしない。
440デフォルトの名無しさん:2011/06/20(月) 00:06:06.90
new( &a ) int;

は何もしないけど

new( &a ) int();

だと0になるんだよな
441デフォルトの名無しさん:2011/06/20(月) 07:11:02.68
placement new関係ねえ
442デフォルトの名無しさん:2011/06/20(月) 15:59:28.21
あのー
c++ってコンパイラー必要じゃないっすか
んで、プログラミングしてはコンパイルを繰り返してたら
ふと、思ったんすけどォー

c++でアプリ作っても他のPCで動作させる時に
そのPCにもc++のコンパイラーって必要じゃないですか?

アァアアアアン?
そこんとこどうなんだよコラ
443デフォルトの名無しさん:2011/06/20(月) 16:00:50.47
>>442
何のためにコンパイルしてると思ってんだ禿
444デフォルトの名無しさん:2011/06/20(月) 16:00:56.90
>>442
>c++でアプリ作っても他のPCで動作させる時に
>そのPCにもc++のコンパイラーって必要じゃないですか?
いいえ
445 忍法帖【Lv=15,xxxPT】 :2011/06/20(月) 16:34:44.73
プラットホームの話だとおもわれ
446デフォルトの名無しさん:2011/06/20(月) 16:41:23.51
実行ファイルの存在を知らない低能だと思った
447デフォルトの名無しさん:2011/06/20(月) 17:08:15.22
作ってる側は煮たり焼いたり揚げたりしてるけれど食う側は関係ないってこった
448 忍法帖【Lv=8,xxxP】 :2011/06/20(月) 17:21:50.48
喰うのに道具が要る場合もあるが。
449デフォルトの名無しさん:2011/06/20(月) 17:21:55.80
素人に向かって低脳とは酷い奴だな
450デフォルトの名無しさん:2011/06/20(月) 17:43:41.02
>>448
それがDirectXとかじゃないかな
451デフォルトの名無しさん:2011/06/20(月) 18:22:07.60
素人以前に礼儀もなってないので低能でおk
452デフォルトの名無しさん:2011/06/20(月) 20:21:40.48
>>451
死ね
453デフォルトの名無しさん:2011/06/20(月) 21:16:05.38
テンプレート関数で構造体をテンプレートに置き換えたら外部参照エラーがでた
どういうことなの?
454デフォルトの名無しさん:2011/06/20(月) 21:40:03.86
>>442
おめーさ、デバッグビルドした exe を「他のPC」に持って行ってない?
455デフォルトの名無しさん:2011/06/20(月) 21:59:38.65
//構造体定義ファイル struct.h
typedef st{
...
}

//関数宣言ヘッダファイル func.h
template<typename T> void fucntion(T* inout);
//関数定義 func.cpp
#include "func.h"
template<typename T> void fucntion(T* inout)
{
...
}
//main関数ファイル
#include "struct.h"
#include "func.h"
void main(){
st* inout;
function<st>(inout);//LNK error
return;
}
//どういうことなの?
456デフォルトの名無しさん:2011/06/20(月) 22:06:45.46
func.cppコンパイルしたのか?
457デフォルトの名無しさん:2011/06/20(月) 22:14:44.63
こうじゃね?
//関数定義 func.cpp
#include "struct.h"
#include "func.h"
template<typename T> void fucntion(T* inout)
{
...
}

template<> void function<st>(st* inout)
{
...
}
458デフォルトの名無しさん:2011/06/20(月) 22:15:48.74
げっ
includeしたらマジで通った
でもテンプレートする前はfunc.cppインクルードしなくても通ったんだよ?
459デフォルトの名無しさん:2011/06/20(月) 22:16:12.77
func.hにfucntionの定義を書かないとダメ
460デフォルトの名無しさん:2011/06/20(月) 22:17:15.22
>>457
後出しで申し訳ないがstは数種類あって特殊化はしたくないのぜ
461デフォルトの名無しさん:2011/06/20(月) 22:17:59.42
>>459
それってどういうココロなの?
宣言さえしておけば勝手に探してくれるんだと・・・
462デフォルトの名無しさん:2011/06/20(月) 22:20:45.35
テンプレートはcppに定義分けて書いたりできないよ
463デフォルトの名無しさん:2011/06/20(月) 22:27:54.39
>>462
ふーん
じゃあ全部ヘッダにまとめるか
サンクス
464デフォルトの名無しさん:2011/06/20(月) 22:37:52.15
実体化してないからだろ
465デフォルトの名無しさん:2011/06/20(月) 22:52:46.60
コンテナのqueueって何のためにあるんだ?全部dequeでよくね?
466デフォルトの名無しさん:2011/06/20(月) 23:02:32.87
>>455
非常に長々と書くと
func.h,func.cpp どちらにも function<st>が存在しないので function<st>は作られない
main に function<st> が出てきたので、このときに作ろうとする(実体化しようとする)けれど
この main がインクルードしている func.h には関数の宣言しか書かれていないので実体化できない
リンカは func.obj にも main.obj にも function<st> が存在しないのでリンカがエラーを吐く
という感じではないかと思う...
467デフォルトの名無しさん:2011/06/20(月) 23:07:00.70
>>465
listやdeque等のコンテナを選べる。
さらに言えば、push_back等のいくつかのメンバ関数を満たしていれば自作コンテナも使える。
468デフォルトの名無しさん:2011/06/20(月) 23:07:42.42
>>465
FIFOを強制させたい場合に使う
469デフォルトの名無しさん:2011/06/20(月) 23:43:14.08
>>465
dequeだと反対側に突っ込んじゃうかもしれないだろ
470デフォルトの名無しさん:2011/06/21(火) 00:19:54.55
queueってdequeと比べてなんかえらく不便だった気がする
471デフォルトの名無しさん:2011/06/21(火) 01:07:43.28
queueってただのコンテナアダプタだろ
bidirectional_iteratorなら何でも上に被せられるってだけのもの
472デフォルトの名無しさん:2011/06/21(火) 06:18:20.27
>>470
あえて不便にしてるんじゃないか
473デフォルトの名無しさん:2011/06/21(火) 16:30:53.36
じゃあ、c++で作ったプログラムをコンパイラ無しに
動作させるにはどうすればいいんですか?
474デフォルトの名無しさん:2011/06/21(火) 16:32:36.01
一体どこからじゃあに繋がるんだ
475デフォルトの名無しさん:2011/06/21(火) 18:45:31.05
製作者と環境を一致させる
476デフォルトの名無しさん:2011/06/21(火) 19:49:55.33
>>470
std::queue はコンテナ要件満たしていないはず
begin() や end() も定義されていない
477デフォルトの名無しさん:2011/06/21(火) 21:18:54.37
まず何とC++を比べているのだろうか・・・
478デフォルトの名無しさん:2011/06/21(火) 21:25:18.88
予言しよう・・・
近いうちに、俺は結婚を申し込まれるだろう・・
479デフォルトの名無しさん:2011/06/21(火) 21:26:22.03
>>478

結婚してください!!!!!
480デフォルトの名無しさん:2011/06/21(火) 21:40:37.08
>>478
481uy ◆yyC0rYWEq2 :2011/06/22(水) 08:37:18.08
どうして学校でC++やらせんだろうね
しかも基本Vijuaru Stajioで
Vijyuar Stugioのゴミさは、この程度も設定できないようなksは
技術さわんなってっていういかれた頭の持ち主の示す意思表示に見えなくもなくもない
いかれてやがる
そしてC++しか知らないままC++をやり続ける奴がきっと多い
すげーレベルで時間の無駄 これはソフトウェア面で完全に世界から送れちまってる日本のみの現状か・・・
日本効率も悪いんだな・・・・・・

つうか学校のカリキュラムが変わりすぎじゃないのか?


10年前はC、C++
5年前はJAVA
今はRubyなんだろ?
同じ学校でも、その学校に在籍していた時代によって教わってる内容が違いすぎるw
右往左往しすぎだわ

ゴミみたいな分野だしな・・・ さっさと何らかの形で統一されないと
482デフォルトの名無しさん:2011/06/22(水) 08:55:48.09
rubyタグ使うサイトは許せない
483デフォルトの名無しさん:2011/06/22(水) 09:27:47.30
>>481
主張は結構
だがこのスレで扱う話題ではないな
484デフォルトの名無しさん:2011/06/22(水) 09:40:53.12
HaskellスレのPerl忍者と同一人物?
485デフォルトの名無しさん:2011/06/22(水) 14:48:54.25
>Vijyuar Stugio

ってなんですか?
486デフォルトの名無しさん:2011/06/22(水) 15:43:32.22
なんでおばかさんすぐ釣られてしまうん?
487 忍法帖【Lv=9,xxxP】 :2011/06/22(水) 16:13:27.79
意図的なスペリングミスをやっている奴はそんなに多くない。
逆に考えれば……まぁ、言うまでもないな。
488デフォルトの名無しさん:2011/06/22(水) 21:07:18.96
敗因を言語のせいにしてんじゃねえよ
そーゆー根性こそ問題の核心だ
489デフォルトの名無しさん:2011/06/22(水) 21:21:36.80
てs
490デフォルトの名無しさん:2011/06/23(木) 07:18:00.64
3項演算の優先順位にはいつも悩まされる・・・
someBool?a:b + c;
って
someBool?a:(b+c);
なんだな、心では
(someBool?a:b)+c;
なんだが・・・
皆もう慣れてるん?
491デフォルトの名無しさん:2011/06/23(木) 07:47:57.90
>>490
個人的に3項演算子はそれだけで1行使うようにしてるから、あんまり悩んだ事ない。
x = someBool?a:b;
x += c;
括弧使うのってカンマ演算子くらいかも。
x = someBool?a:(some,b);
492デフォルトの名無しさん:2011/06/23(木) 07:54:23.66
馴れなきゃかっこつけろ。
493デフォルトの名無しさん:2011/06/23(木) 08:00:26.15
3項演算子って簡単な奴だったらif文わないで済むからコードの短縮になるので
ついつい連発しちゃうんだよな〜
カッコ付けるようにすればいいんだろうけど、忘れた頃に同じようにやっちまうからなぁ
まあここに書き込んだことが心に残って防止になればそれでいいや
494デフォルトの名無しさん:2011/06/23(木) 08:06:11.46
>>492
んで、かっこ悪いっていわれるわけですね。
495デフォルトの名無しさん:2011/06/23(木) 09:24:57.90
要らないとこまで括弧つけまくる病気にかかったことがある p=&(obj); みたいに
関数みたいで読みやすくなるかと思ったがいまいちだったな
496デフォルトの名無しさん:2011/06/23(木) 09:50:18.53
>>490
PHPほどじゃないよ
497デフォルトの名無しさん:2011/06/23(木) 11:08:12.94
クラスにテンプレートな型のメンバ変数を持たせる事は可能でしょうか?
498デフォルトの名無しさん:2011/06/23(木) 11:28:22.99
template<type T>
class c {
T type;
};
ということなら可能
499デフォルトの名無しさん:2011/06/23(木) 12:32:17.56
>>498
ありがとうございます。

では、それを使って具体的にクラスをコンストラクトするにはどうしたらいいのでしょうか?
500デフォルトの名無しさん:2011/06/23(木) 12:34:17.57
>>499
498の例なら
c::c(T t) : type(t) {}
するだけじゃ?
501デフォルトの名無しさん:2011/06/23(木) 15:13:24.16
template <class T> class Hoge {
T t;
public:
Hoge(){}
template <class U>Hoge(U const & u): t(u){}
template <class U1, class U2>Hoge(U1 const & u1, U2 const & u2): t(u1, u2){}
/*
以下飽きるまで繰り返す
*/
};

これでほとんど行けるよ
502デフォルトの名無しさん:2011/06/23(木) 17:44:13.71
>>500
>>501
なんかつかめて来た気がします!ありがとうございます
最近CからC++始めたんですけど、C++ぱねぇっすね、やりたい放題というか、すごく充実してるというか
503デフォルトの名無しさん:2011/06/23(木) 18:53:29.11
ぱねぇ
504デフォルトの名無しさん:2011/06/23(木) 23:47:55.15
クラスの設計の仕方がわかりませんorz
コンパイラを作っているのですが、1つのクラスに50個くらい関数があります。
字句解析、構文解析、意味解析、コード生成などなど・・・
それぞれクラスにした方がいいのかもしれませんが、分けたところで何を得するのかわかりません。
結局インスタンス化も1つしかしないし、意味あるんでしょうか?
いっそのことクラスを取っ払ってC言語として書いたほうがいいのでしょうか?
オブジェクト指向って難しい。
505デフォルトの名無しさん:2011/06/23(木) 23:57:38.87
その状態でコンパイラを作ろうってのが凄いな。
506デフォルトの名無しさん:2011/06/23(木) 23:57:42.07
507デフォルトの名無しさん:2011/06/24(金) 00:05:13.24
>>505
C++がわからないとコンパイラ書いちゃいけないんですか?
508デフォルトの名無しさん:2011/06/24(金) 00:08:56.97
boost::spiritあたり使えばいいんじゃないかな
509デフォルトの名無しさん:2011/06/24(金) 01:17:53.57
クラスにしておけば
C++構文解析、C構文解析
ARMコード生成、x86コード生成
みたいに分けられて
後からObjective-C構文解析だとかx64コード生成とか
簡単に追加できる
510デフォルトの名無しさん:2011/06/24(金) 07:15:43.70
別にクラスじゃなくても簡単に追加できるけどな
511デフォルトの名無しさん:2011/06/24(金) 08:02:43.70
どうしても納得いかないところが。
複数の翻訳単位でインクルードされているヘッダファイルがあって、const char* はextern をつけているから問題ない。
しかし、extern をつけていないenumは多重定義エラーが出ないのはなぜでしょうか?
512デフォルトの名無しさん:2011/06/24(金) 08:09:19.10
>>511 C++でおk
513デフォルトの名無しさん:2011/06/24(金) 11:09:54.64
コンストラクタとして、例えば、メンバ変数aに1を代入するのと、変数bに1を代入するのがあったとして、
その二つのコンストラクタを使って、同時にaとbを初期化するコンストラクタとか作れますかね?
つまりコンストラクタの中でコンストラクタを呼び出す的な
514デフォルトの名無しさん:2011/06/24(金) 11:13:08.09
virtualじゃなきゃメンバ関数読んでいいんだからそういうメンバ関数作れば?
でも普通初期化は初期化子でやるよ
515デフォルトの名無しさん:2011/06/24(金) 11:58:02.34
>>513
委譲コンストラクタはC++0xから
現行だと一時オブジェクトが生まれるだけになる
516デフォルトの名無しさん:2011/06/24(金) 12:35:18.89
C++とDxLibで、配列を使ってウィンドウの管理をしようとしています。下記のコードでウィンドウA(赤い四角)を表示しようとしたのですが、親クラスのウィンドウ(白い四角)が表示されてしまいます。
ウィンドウAを表示するための解決方法はありますでしょうか?(ウィンドウは他にも、ウィンドウBやウィンドウCなどに継承していく予定です)
改行対策のため読みづらいとは思いますが、よろしくおねがいします。
class Window{ //全てのウィンドウの親クラス
 Window(){}
 void draw_window(){
  DrawRect(0,0,100,100,GetColor(255,255,255),true); //白い四角形を表示する関数
 }};
class WindowA : public Window{ //ウィンドウAクラス
 WindowA(){}
 void draw_window(){
  DrawString(0,0,100,100,GetColor(255,0,0),true); //赤い四角形を表示する関数
 }};
class Windows{ //ウィンドウ管理クラス
 std::vector<Window> windows;
 Windows(){}
 void add_window(Window window){
  windows.push_back(window);
 }
 void draw_windows(){ //全てのウィンドウをdraw_window()する
  int num = windows.size();
  for(int i=0;i<num;i++){
   windows[i].draw_window();
 }}};

//プログラムのメイン部分
Windows windows = Windows();
WindowA window_a() = WindowA();
windows.add_window(window_a);
windows.draw_windows();
517デフォルトの名無しさん:2011/06/24(金) 12:44:35.22
継承で多態するならvirtual付けなはれ
class Window {
 virtual draw_window() {...}
518デフォルトの名無しさん:2011/06/24(金) 12:45:43.80
void add_window(Window window)
これじゃ毎回コピーされるがいいのか?
519デフォルトの名無しさん:2011/06/24(金) 12:51:06.26
windows.add_window(window_a);
スライシングが起きるよね
520デフォルトの名無しさん:2011/06/24(金) 13:18:54.73
>std::vector<Window> windows;
std::vector<Window*>
手を抜きたいなら
std::vector<std::shared_ptr<Window>>
boost::ptr_vector<Window>
521デフォルトの名無しさん:2011/06/24(金) 13:34:06.65
>>518>>519は、参照渡しにしたほうがいいということですね?

C++に触れて2日目で右も左も分かりませんが、
いただいたレスをヒントに格闘してみます。
>>517,>>518, >>519, >>520さん、ありがとうございました。
522デフォルトの名無しさん:2011/06/24(金) 13:51:53.10
>>std::vector<Window> windows;
std::vector<Window *> windows;

>>void add_window(Window window)
void add_window(Window& window)

>>windows.push_back(window);
windows.push_back(&window);

>>windows[i].draw_window();
windows[i]->draw_window();

で無事動きました。ありがとうございました!
かなり大きな前進になると思います。
523デフォルトの名無しさん:2011/06/24(金) 13:56:09.46
std::vector<Window>はあくまでWindowクラスを入れるためのベクタなので
派生であるWindowAクラスをそのまま入れることはできないのです
基底クラスとその派生クラスを管理したい場合は、ポインタなら基底クラスから
派生クラスまで指し示せるのでポインタで管理するのがセオリー std::vector<Window*>
ただそうするとオブジェクトの解放処理(delete)が面倒なのでスマートポインタ
shared_ptr<Window>を使うと管理が楽になりましゅ vector< shared_ptr<Window> >
524デフォルトの名無しさん:2011/06/24(金) 14:21:24.70
boost::ptr_vectorでもいいよ
525デフォルトの名無しさん:2011/06/24(金) 14:26:01.59
std::vector<std::unique_ptr<Window> >でもいいのよ
526デフォルトの名無しさん:2011/06/24(金) 15:32:14.82
うちのコンパイラはまだstd::unique_ptr対応してないから
vector<autoptr<Window> >使うお
527デフォルトの名無しさん:2011/06/24(金) 15:35:06.41
>>526
おいバカやめろ
528デフォルトの名無しさん:2011/06/24(金) 15:37:08.81
皆さんありがとうございます。
>>523, >>525に書いてあるようにスマートポインタでやってみたのですが、
'void std::vector<_Ty>::push_back(_Ty &&)' : 1 番目の引数を 'Window' から 'std::unique_ptr<_Ty> &&' に変換できません。
となってコンパイル出来ませんでした。

>>524のboost::ptr_vectorでコンパイル・実行しても、終了時に
Debug Assertion Failed!
Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
というダイアログが出るので、このまま使ってもいいものかどうか…。

スマートポインタは素人が使っても大丈夫なモノなんでしょうか
529デフォルトの名無しさん:2011/06/24(金) 15:46:00.78
>>528のboostを使ったときのエラーは、どうやら別の原因のようです。
設定をいじったせいかは分かりませんが、お騒がせしました。

エラー吐かないように直して、改めてboostを試してみます。
530デフォルトの名無しさん:2011/06/24(金) 16:05:54.62
ううむ、エラーが出ないようにしてからboost::ptr_vectorを試したのですが、
また同じエラーが発生してしまいました。

まだdeleteの必要性も理解出来ていないので、
勉強も兼ねてstd::vector<Window*>を使ってみますね。
こんな話題でスレ汚ししちゃって申し訳ないです(;´Д`)
531デフォルトの名無しさん:2011/06/24(金) 16:45:22.42
まあ、いいってことよ。
わからない事があったらいつでも俺に聞け。





























俺も知らんけど。
532デフォルトの名無しさん:2011/06/24(金) 16:55:41.98
無いとは思うんだがテンプレートでの指定が<Window>だからってWindow型を突っ込もうとはしてないよねぇ
533デフォルトの名無しさん:2011/06/24(金) 17:03:15.75
hito.csv
1,山田,28,165,60,100,20,30,
2,鈴木,40,178,80,100,20,30,
3,佐藤,31,170,70,100,20,30,

カンマ区切りされたファイルをifstreamでファイルを選択して
getlineでカンマ区切りで摘出までは理解してます

全データを選ばず、特定の行だけを抜き出すにはどうすればいいでしょうか?
534デフォルトの名無しさん:2011/06/24(金) 17:08:07.93
>>533
行のバイト数が固定ならfseekで飛べるけどそうじゃないだろうから
読み捨ててくしか無い
何行目なのかを知る方法が改行文字を認識するしか無いからな
535デフォルトの名無しさん:2011/06/24(金) 17:08:29.02
カンマ区切りで抽出できるのに
特定の行だけ抜き出すのは無理なの?
536533:2011/06/24(金) 17:11:26.16
>>535
先頭から順番に全部抜き出して配列にぶち込む

その配列から特定の行分抜き出す

なら可能だけど、この方法では毎回全データを読み取ってから
その中から1つ取り出すという手法になってしまって・・・
537デフォルトの名無しさん:2011/06/24(金) 17:13:32.46
>>536
それでいいじゃん
なにがダメなの?
538デフォルトの名無しさん:2011/06/24(金) 17:16:19.04
>>532
え?じゃあ何型を突っ込めば…?というレベルなので、
多分それが原因だと思います…。
前に使ってた言語がPHPなので、型に厳しい言語に戸惑ってます。
もうちょっとC++に慣れてから挑戦してみますね。
539デフォルトの名無しさん:2011/06/24(金) 17:27:32.50
>>537
3人程度ならそれで良さそうだけど数千人で、しかも要素が10や20になると数万だからな
540デフォルトの名無しさん:2011/06/24(金) 17:33:23.68
>>539
そんなにあるならDB使え気になるわ
541デフォルトの名無しさん:2011/06/24(金) 17:41:12.21
iostream::ignore
542デフォルトの名無しさん:2011/06/24(金) 18:07:41.60
#include <iostream>
#include <fstream>
#include <string>

bool satisfies_some_condition(const std::string &line)
{
return line.find("山田") != std::string::npos;
}

int main()
{
std::ifstream ifs("hito.csv");
std::string line;
while (std::getline(ifs, line)) {
if (satisfies_some_condition(line)) {
std::cout << line << std::endl;
}
}
}
543デフォルトの名無しさん:2011/06/24(金) 18:28:55.02
>>530
こんな感じでいいのかな
http://codepad.org/y3jWmkqf
544デフォルトの名無しさん:2011/06/24(金) 20:20:15.01
>>543
クラス内でtypedef出来るんだ!とか、->と.の違いを今知ったりとか、ふがいないばかりでございますorz
大変参考になるソースをありがとうございました。
545デフォルトの名無しさん:2011/06/24(金) 22:45:58.42
SIMD命令を使ってデータ並列処理を高速化したいです。

ターゲットCPU : Intel Core2シリーズ以上
テーゲットOS : WindowsXP
言語 : C++
コンパイラ : VC++2005付属

インラインアセンブラではなく、できればイントリンシックで記述して使いたいです。
イントリンシック記述を勉強できる本やWebサイト(IntelのPDF以外)で
オススメがあれば教えてください。
546デフォルトの名無しさん:2011/06/25(土) 06:10:10.02
英語おk?
547545:2011/06/25(土) 09:30:39.26
できれば日本語がよいですが、
オブジェクト指向設計の学習では、洋書の訳書がとても勉強になったので、
あちらの書籍、Webに質の良い情報があるだろうことは理解できます。
解読する努力はしますので、是非、ご教示ください。
548デフォルトの名無しさん:2011/06/25(土) 11:08:08.76
VSでプリコンパイル済みヘッダー無しでやってるんだけど、それでヘッダー作ってるんだけど、

hoge.hで宣言
hoge.cppで定義で、

main.cとかで#include"hoge.h"してるんだけど、
それでビルドしたら、定義されてないって文句言われる

どうしたらいいですか?
549デフォルトの名無しさん:2011/06/25(土) 12:07:01.92
>>548
定義すればいいと思います
550デフォルトの名無しさん:2011/06/25(土) 12:10:50.72
hoge.cppにインクルードしてない

void hoge::○○(){}みたいにしてない
551デフォルトの名無しさん:2011/06/25(土) 12:13:52.65
mainがc
552デフォルトの名無しさん:2011/06/25(土) 21:57:28.61
C++でPerlのハッシュと同じものを作りたいのですが
やり方どこかにないっすか
553デフォルトの名無しさん:2011/06/25(土) 22:00:23.54
554デフォルトの名無しさん:2011/06/25(土) 22:12:37.20
拡張子がcのファイルをC++強制にするオプションを知らんようだな
555デフォルトの名無しさん:2011/06/25(土) 23:14:29.38
>>550
hoge.cppでincludeはしてます

>>551
mainはcppの間違いでした
556デフォルトの名無しさん:2011/06/25(土) 23:20:50.33
>>555
ソースどっかに上げて聞いた方が早いと思うぞ。
557デフォルトの名無しさん:2011/06/25(土) 23:34:39.38
>>555
諦めた方が早いと思うぞ。
558デフォルトの名無しさん:2011/06/26(日) 00:27:00.41
このコードを書き換えるとどうなりますか。

int n;
char *p,*q;
do *p++ = *q++; while (--n > 0);
559デフォルトの名無しさん:2011/06/26(日) 00:31:30.04
どう書き換えたいのですか
560デフォルトの名無しさん:2011/06/26(日) 00:46:16.03
>>558
int n;
char *p,*q;
do {
*p = *q;
p++;
q++;
n--;
} while (n > 0);
561デフォルトの名無しさん:2011/06/26(日) 00:52:26.29
VSでやってます

hoge.hで、クラスの定義をして、hoge.cppでクラスのメンバ関数の定義をしてます。
つぎに、そこで作ったクラスを、メンバとして含むようなクラスや、そのクラスのサブクラスを別のファイル(ヘッダーとリソースファイルに)作りたいと思います
その場合、#include等はどうしたらいいですか?

色々やってるんだけど、クラスが再定義されてるって言われたり、定義がされてないって言われたりして困ってます
562561,548:2011/06/26(日) 00:57:42.64
ちなみにさっきは、#include "stdafx.h" だけをインクルード(ヘッダーとリソース両方に全部)したんですけど、
今度は定義がないって言われました
563デフォルトの名無しさん:2011/06/26(日) 01:04:42.05
ちょっとstdafx.hとstdafx.cppのコードを乗せてみろ
一部でいいから
564デフォルトの名無しさん:2011/06/26(日) 01:07:38.53
>>561
インクルードガードはちゃんとやってる?
565561,548:2011/06/26(日) 01:09:41.89
/*stdafx.h*/
#pragma once
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>

// TODO: プログラムに必要な追加ヘッダーをここで参照してください。
#include"ising.h"
#include"metropolis.h"
#include"rand.h"
#include<math.h>
#include <vector>

/*stdafx.cpp*/
// stdafx.cpp : 標準インクルード kadai4_mf.pch のみを
// 含むソース ファイルは、プリコンパイル済みヘッダーになります。
// stdafx.obj にはプリコンパイル済み型情報が含まれます。

#include "stdafx.h"

// TODO: このファイルではなく、STDAFX.H で必要な
// 追加ヘッダーを参照してください。

//こっちは特に弄ってません、そのままです
566デフォルトの名無しさん:2011/06/26(日) 01:11:22.70
#include <iostream>
using namespace std;
int myabs(int n);
long myabs(long n);
double myabs(double n);
int main(){
cout <<"-10の絶対値:"<<myabs(-10)<<"\n";
cout <<"-10Lの絶対値:"<<myabs(-10L)<<"\n";
cout <<"-10.01の絶対値:"<<myabs(-10.01)<<"\n";
char a='u';
while(a!='o')
cin>>a;
return 0; }
int myabs(int n) {
cout <<"整数用のmyabs()\n";
return n<0?-n:n; }
long myabs(long n) {
cout <<"長整数用のmyabs()\n";
return n<0?-n:n; }
double myabs(double n) {
cout <<"浮動小数点用のmyabs()\n";
return n<0?-n:n; }

実行結果
整数用のmyabs()
-10の絶対値:10
長整数用のmyabs()
-10Lの絶対値:10
浮動小数点用のmyabs()
-10.01の絶対値:10.01
567561,548:2011/06/26(日) 01:11:44.45
>>564
やっぱりインクルードガードしないと駄目ですかね・・・
VSで自動的にビルドでうまくやってくれたりはしないのかな・・・
568デフォルトの名無しさん:2011/06/26(日) 01:22:58.06
それで今やりたいことは
stdafx.hをインクルードしたhoge.hかhoge.cppでmyabs(10);とかmyabs(10.01);とか使いたい
ということでいいのか?
569561,548:2011/06/26(日) 01:28:20.27
>>568
いえ、566は自分ではないです

rand.hで宣言、定義されたクラスを内部に含むクラスをmetropolis.hを宣言、定義して、
ising.hでそのクラスを継承したいんです。

メンバ関数は、同名のcppで定義してます。
というか、クラスの宣言だけ、ヘッダーでやるってのは可能でしょうか

class metropolis;

みたいな感じで
570>>566のものです:2011/06/26(日) 01:29:16.58
>>566は単レスです

>>565とは無関係です
混乱させてすいません

>>566の質問を忘れてました
>>566の質問はcoutの使い方についてです
coutの出力順が意図していないものでしたのでそこんとこ教えてください
571デフォルトの名無しさん:2011/06/26(日) 01:40:35.84
>>570
どういう出力順を意図していたのか説明してみ
572デフォルトの名無しさん:2011/06/26(日) 01:43:14.14
>>569
ああ、別だったの

クラスを内部に含むクラスっていうのがよくわからんな
class metropolis
{
class rand hoge;

}
みたいなことがしたいのか
573561,548:2011/06/26(日) 01:47:14.06
>>566
たとえば、f(g(x))という関数を考えた時に、
これを計算するときどうする?

まずg(x)を計算して、それをfに代入するでしょう?

だから、
>cout <<"-10の絶対値:"<<myabs(-10)<<"\n";
では、最初にmyabsが評価(計算)され、
cout <<"整数用のmyabs()\n"
が実行され、”整数用のmyabs()”が出力される

その意図なら、関数にstringを返させるようにするべき
574561,548:2011/06/26(日) 01:47:51.87
>>572
クラスのネストで、そんな感じです
575デフォルトの名無しさん:2011/06/26(日) 02:03:46.30
>>574
それなら定義されてないってことは無い気はするけれど・・・

rand.h metropolis.h ising.hを見てみないとわからんな
576デフォルトの名無しさん:2011/06/26(日) 02:07:53.53
>>571
参考書のコードなんですが
こんなところを予想してました
実行結果

整数用のmyabs()
10-10の絶対値:
長整数用のmyabs()
10-10Lの絶対値:
浮動小数点用のmyabs()
10.01-10.01の絶対値:

577561,548:2011/06/26(日) 02:37:22.58
/*rand.h*/
//#include<isostream>
#include "stdafx.h"


/*ex*/ unsigned int mod_mul(int a,int x);
/*ex*/ int one(int x);
/*ex*/ double to_p(unsigned int x);
/*ex*/ double to_gau(double a1,double a2);



class RRAND
{
int a;
unsigned int x;
unsigned int size;
void step();

public:
RRAND(void);
RRAND(unsigned int n);
double rand(void);
unsigned int rand(unsigned n);
bool rand(double p);
unsigned int dist();
double gauss();
void ini();
void ini(int s);
};
578561,548:2011/06/26(日) 02:39:09.95
/*metropolis.h*/
//#include"rand.h"
#include "stdafx.h"


//template <class state,class sstate>
class state
{
friend class sstate;
protected:
// friend class metropolis;
double h;
RRAND& r;
public:
double t;
virtual double comp_h();
virtual state& operator=(const sstate& ss);
RRAND& get_r(){return r;}

};
//template <class state,class sstate>
class sstate
{
protected:
// friend class metropolis;
RRAND& r;
state& s;
double h;
public:
virtual double comp_h();
};
579561,548:2011/06/26(日) 02:42:47.69
template <class state,class sstate>
class metropolis
{
protected:
state s;
sstate ss;
//double h;
RRAND r;

virtual void chose_ss();
virtual double p_s();
virtual double p_ss();
virtual double pt_s();
virtual double pt_ss();

metropolis(state& c1,sstate& c2) : s(c1),ss(c2){};
void step();
void step(int n);

public:
};

/*ising.h*/
#include "stdafx.h"
typedef signed char s_c;
using namespace std
class i_state : public state
{
private:
friend class i_sstate;
friend class magtropolis;
int x,y;
580561,548:2011/06/26(日) 02:44:52.20
vector<vector<signed char>> magnet;
public:
i_state(int x,int y);
s_c n(int,int);
s_c e(int,int);
s_c w(int,int);
s_c s(int,int);
s_c h_point(int sx,int sy);
double comp_h();
i_state& operator=(const i_sstate& ss);
};
class i_sstate : public sstate
{

private:
friend class magtropolis;
friend class i_state;
int x,y;
double comp_h();
};

class magtropolis : public metropolis<i_state,i_sstate>
{
void chose_ss();
double p_s();
double p_ss();
double pt_s();
double pt_ss();
};

int Fb(int size,int x,int y);
double boltz(double h,double t);
581デフォルトの名無しさん:2011/06/26(日) 02:46:52.99
■長いソースを貼るときはここへ。■
 http://codepad.org/
 http://ideone.com/
582デフォルトの名無しさん:2011/06/26(日) 03:03:06.53
ising.h
metropolis.h
rand.h
の先頭に
#pragma onceを追加

rand.hは何もincludeしなくて良い
metropolis.hは"rand.h"だけをinclude
ising.hは"metropolis.h"と<vector>をinclude
583デフォルトの名無しさん:2011/06/26(日) 03:10:06.18
何故標準ライブラリに単方向リストが無いのですか?
戻る気が無い時にこれではオーバースペックでしょう?
584デフォルトの名無しさん:2011/06/26(日) 03:22:16.78
stdafx.hに詰め込んでこれだけインクルードすればわかりやすくて楽じゃねって言う発想かもしれないが
多重定義とか相互インクルードを引き起こすからやめたほうがいい
585デフォルトの名無しさん:2011/06/26(日) 03:22:32.80
C++0xでforward_listが入るから待ってろ
586デフォルトの名無しさん:2011/06/26(日) 03:23:01.03
今回定義されてないって出てたのは
// TODO: プログラムに必要な追加ヘッダーをここで参照してください。
#include"ising.h"
#include"metropolis.h"
#include"rand.h"
この並び順のせいだな
rand>metropolis>isingの順に流れていくのに読み込みが逆になっている
これだと最初にising.hが呼び出され、他の定義を読めるはずがない

587デフォルトの名無しさん:2011/06/26(日) 03:37:46.42
>>585
あり^^
588デフォルトの名無しさん:2011/06/26(日) 10:43:49.40
>>576
関数を呼ばずにその結果を利用することは不可能だから、
関数内で出力する限り無理。
589デフォルトの名無しさん:2011/06/26(日) 10:56:59.22
>>576
どうでもいけどコロンの使い方がおかしい
590デフォルトの名無しさん:2011/06/27(月) 02:50:34.86
FILE *fp;
fp = fopen("a.txt" "w");
fprintf(fp, "aaaa");

としたとき、fprintf関数で書き込んだ内容はクリアできますか?
おそらく、

fclose(fp);
fp = fopen("a.txt" "w");

とすればうまくいくのでしょうが、ファイルを閉じずに行う方法が知りたいです。
591デフォルトの名無しさん:2011/06/27(月) 02:52:20.26
自己解決しましたすみませんでした
592561,548:2011/06/27(月) 08:28:21.23
>>582
一応それもためしてみたんですけど、stdafx.hの作用がどうもよく分からなくて・・・
includeしてなかったら文句言われるし、してたら多重定義になっちゃうし・・・

>>584
そもそもVSがどんなふうにコンパイルしてるか良く分からないんですよね
makeファイルとかで、自分で全部管理した方が楽なのかな・・・

>>586
とりあえずそれでやってみたらできました

えっと、内部クラスの質問なんですけど、内部クラスってのは、外部クラスがコンストラクトされた時、自動的に生成されるものなのですか?
もしそうなら、特定のコンストラクタ(引数を取る)でもって、内部クラスを生成するにはどうしたらいいですか?
593デフォルトの名無しさん:2011/06/27(月) 08:37:23.18
自動で生成されるわけないだろ
お前はstruct { };って書いたら勝手にインスタンスできると思ってるのか?
594 [―{}@{}@{}-] デフォルトの名無しさん:2011/06/27(月) 08:39:50.55
stdafx.hを使わなきゃいいじゃん
595デフォルトの名無しさん:2011/06/27(月) 08:49:27.41
俺もはじめてVC使ったとき、色々戸惑ったが、
stdafx.hにはイラついて、使わなかった覚えがある。
596561,548:2011/06/27(月) 08:50:42.91
>>593
でも、例えば、
class Int{
int n;
};

で、
Int i;
とすると、自動的に整数用の領域が確保されるじゃないですか

同様に
class In{
int n;
};
class Out{
In in;
};

として

Out out;

とすると、自動的にクラスIn型の変数inも生成されるんじゃないんですか?

>>594
VSの使い方が分かんなくて、使わないとエラー吐かれて対処できないんです
597デフォルトの名無しさん:2011/06/27(月) 08:57:09.19
>VSの使い方が分かんなくて、使わないとエラー吐かれて対処できないんです

そのエラーみつけて対処するくらいのことができなきゃ、
靴も履けずにマラソンに出かけるような展開になるぞ。
598デフォルトの名無しさん:2011/06/27(月) 09:07:20.77
>>596
そりゃぁ生成されるけど、質問の意図が判らん。
599561,548:2011/06/27(月) 09:29:24.76
>>597
まあせっかくVS入れたので、ちゃんと勉強する予定ではあります

>>598
つまり、生成されるということは、Out型クラスをインスタンス化した時に、
何らかのInのコンストラクタが呼び出されているという事じゃないですか。
で、この時呼び出されるInのコンストラクタに引数を持たせたいんです
600デフォルトの名無しさん:2011/06/27(月) 09:47:20.24
>>599
質問は「データメンバをデフォルトコンストラクタ以外で初期化する方法は?」でいいのかな?
601561,548:2011/06/27(月) 09:56:59.26
>>600
はい
602デフォルトの名無しさん:2011/06/27(月) 10:02:34.14
こいつは初期化子のことを聞いてるのか?
603デフォルトの名無しさん:2011/06/27(月) 10:03:42.79
どうも、そのようだ。
604デフォルトの名無しさん:2011/06/27(月) 10:21:03.59
コンストラクタの初期化リストだろ。
605561,548:2011/06/27(月) 10:40:48.52
初期化子じゃなくて、呼び出されるコンストラクタを指定したいのです、
というのは、内部クラスが参照変数のメンバを持ってるので
606デフォルトの名無しさん:2011/06/27(月) 10:45:10.60
そんなの好きなコンストラクタ呼べばいいだろが
なにいってんだこいつ
607デフォルトの名無しさん:2011/06/27(月) 10:45:24.79
C++コードでok
608デフォルトの名無しさん:2011/06/27(月) 10:47:45.84
{ } の初期子と勘違いしてるのか?
609デフォルトの名無しさん:2011/06/27(月) 10:51:04.16
class Hoge {
std::pari<int, char> &x;

// Hoge(): x(12, 'a') {} // Error!
};
ということだろうか。
610デフォルトの名無しさん:2011/06/27(月) 10:51:49.35
class c {
int& n;
c() { }
};
いやこうだろう
611561,548:2011/06/27(月) 10:54:02.25
つまり、>>596だと、

class In{
int n;
public:
In(int m):n(m){}
};
class Out{
In in;
public:
Out(int m){
In n(m);
}
};
とすれば、Outでこのコンストラクタを使った時に、
自動的に内部にmの値を持つ、内部クラスnが生成されるって事ですか?
612デフォルトの名無しさん:2011/06/27(月) 10:54:50.18
そもそも参照変数なのにそれのコンストラクタって時点でなに言ってんだか
突っ込む前に呼んであるだろ
そのとき好きなの呼べよ
613デフォルトの名無しさん:2011/06/27(月) 10:56:29.85
>>611
いや普通にコンパイルエラーじゃないかなw
614デフォルトの名無しさん:2011/06/27(月) 11:02:46.02
いいからクラスについて勉強しなおせ
そんな理解で難しいことやろうとするからはまるんだ
615561,548:2011/06/27(月) 11:05:49.10
参照ってのは、つまり

class In{
int& n;//参照
public:
In(int m):n(m){}
};
class Out{
In in;
int n;
public:
Out(int m){
n = m;
In in(n);
}
};

こういう事です

>>612
・・・つまり?

>>613
どうしたらいいと思いますか?
616デフォルトの名無しさん:2011/06/27(月) 11:05:56.75
>>605
呼び出されるコンストラクタを指定するのにコンストラクタ初期化リスト中の初期化子を使うんだよ。
617デフォルトの名無しさん:2011/06/27(月) 11:06:51.46
釣りだろこいつ
618デフォルトの名無しさん:2011/06/27(月) 11:07:31.76
俺としたことが頭悪い釣りに引っかかってしまったぜハッハッハ
619561,548:2011/06/27(月) 11:10:41.42
えっと、じゃあ

In(int m):n(m){}

で、n(m)ってのは、代入してるだけかと思ってたんですけど、
やってる事はコピーコンストラクタの呼び出しで、この部分で好きなコンストラクタを呼び出せたりしちゃうんでしょうか?

もしそうだった場合

Out(int m):in(n(m)){}

というような、入れ子には出来るでしょうか?
620561,548:2011/06/27(月) 11:14:01.75
>>616
>>617
>>618
ごめんなさい初期化リストというのがどういうものか知りませんでした・・・

:の横って、ただ代入してるだけかと思ってました・・・
621デフォルトの名無しさん:2011/06/27(月) 11:18:37.96
知らないキーワードが出てきた時点でググれよカス
622デフォルトの名無しさん:2011/06/27(月) 11:27:58.02
>>619
できるわけねーだろカス

あと参照に関数のローカル変数突っ込んでるぞ
623デフォルトの名無しさん:2011/06/27(月) 11:28:33.89
とりあえずもう一度ヘッダーファイルとインクルードとクラスについて学びなおしたほうがいいと思う
これを解決できたとしても今のままじゃまたどこかで詰むようになる
624デフォルトの名無しさん:2011/06/27(月) 11:41:56.34
なんでこの流れにヘッダファイルやらインクルードやらが関係あるの?
625デフォルトの名無しさん:2011/06/27(月) 11:49:39.56
>>624
この馬鹿の名前欄を見れ
626デフォルトの名無しさん:2011/06/27(月) 12:01:55.12
>>621
>>622
>>623
なんだか良く分からないけどコンパイル通りました!
またつまずいたらよろしくお願いします
627デフォルトの名無しさん:2011/06/27(月) 12:15:51.70
ちゃんと基礎を勉強してから来いよ
628デフォルトの名無しさん:2011/06/27(月) 12:20:40.99
コンパイル時に梃子摺ったり、
エラーを理解できないようなクラス間関係は(・A・)イクナイ
使いやすいクラスを作るためには、癒着させないことが大事。
629デフォルトの名無しさん:2011/06/27(月) 12:33:29.78
>>628
は?
エラーを理解できるかどうかはコンパイラの実装にも依存しちゃうんだから、
それが設計の良し悪しの判断基準になるわけないと思うんだけど・・・。

たとえばどんなクラス間関係のこと言ってるの?
630デフォルトの名無しさん:2011/06/27(月) 12:47:26.69
class A {
int a;
・・・
}

a ってpublicじゃないよなprivateだよな?
いつもアクセス修飾子書いてしまってるからわすれてしまった
631デフォルトの名無しさん:2011/06/27(月) 13:59:00.80
privateであってる
632デフォルトの名無しさん:2011/06/27(月) 15:19:29.28
>>628
俺も聞きたい
どんなクラス関係だ?
633デフォルトの名無しさん:2011/06/28(火) 00:37:37.55
template<int> struct Example
{
      template<int> Example()
      {
      }
};
これってどうやってコンストラクタ呼ぶの?
634デフォルトの名無しさん:2011/06/28(火) 00:43:39.39
>>633
http://stackoverflow.com/questions/2786946/c-invoke-explicit-template-constructor
> It's not possible. The Standard also has a note on this at 14.8.1/5 ...
635デフォルトの名無しさん:2011/06/28(火) 00:47:02.87
それだったら最初からコンパイルエラーにしろやって思うがコンパイル速度の問題なんかね。
636デフォルトの名無しさん:2011/06/28(火) 00:56:25.40
>>635
いちおう open issue になっている。
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#264

10年以上放置されちゃってるけどね。

条件の記述がめんどうなだけだろうから、ちゃんとまとめて proposal に
仕上げればわりと簡単にとりこまれるかもね。最低でも数年単位で先に
なるのは確実だけど。
637デフォルトの名無しさん:2011/06/28(火) 19:17:55.24
ここのソースで1.hでの数が5にならないのは何でですか?
http://codepad.org/Q7z3wEK2
638デフォルトの名無しさん:2011/06/28(火) 19:21:43.32
自動変数を学び直せ
639デフォルトの名無しさん:2011/06/28(火) 19:22:03.90
set呼んでないから
640デフォルトの名無しさん:2011/06/28(火) 19:40:55.90
自動変数ですか
調べてみます
641デフォルトの名無しさん:2011/06/28(火) 19:49:49.66
おそらく、インスタンスという概念を理解してない。
class Foo {public: int value = 0; void set(int v) {value = v;}}

Foo a, b, c; // value = 0, 0, 0
a.set(1192); // 1192, 0, 0
c.set(296); // 1192, 0, 296
642デフォルトの名無しさん:2011/06/28(火) 20:30:14.58
>>637
蛇足かもだが、
1.hの書きかただと、2つ以上のcppからインクルードするとリンクエラー出るぞ
void Choge_2::display()をcppに移すか、
void display(){}と宣言と定義を同時にするのがよろし
643デフォルトの名無しさん:2011/06/29(水) 17:26:36.95
丸めの良い実装で参考になりそうなのないですか?
四捨五入と偶数丸めで、0.5足してfloorするだけだと微妙で・・・
644デフォルトの名無しさん:2011/06/29(水) 18:18:11.24
今VC++で通信を行うプログラムを作っていて、テストとして2つ起動して送受信を行おうとしたのですが
Runtime Error
プログラム名.exe
abnormal program termination
が発生するのです。それも
リリースした受信用プログラム+VC++・リリースモードで送信プログラム→受信側がエラー
リリースした送信用プログラム+VC++・リリースモードで受信プログラム→送信側がエラー
リリースした受信用プログラム+リリースした送信用プログラム→両方エラー

・・・と何が原因でエラーが起きているのかまるで分らないのです。
エラーメッセージにも情報らしきものは書かれてなく何をすればいいのか・・・
このようなエラーに何か心当たりはありませんか?
645デフォルトの名無しさん:2011/06/29(水) 18:45:34.48
abortじゃないの?
VC++ならpdbにシンボル書き出して
コールスタック眺めりゃ一発
646デフォルトの名無しさん:2011/06/29(水) 19:25:53.16
>>645
うーんなんか難しそうですね
勉強してみてまだわからなかったらまた来ることにします
ありがとうございます
647デフォルトの名無しさん:2011/06/29(水) 19:28:53.51
>>643
微妙と言われても・・・それで何が不満なの?
648デフォルトの名無しさん:2011/06/29(水) 20:08:47.92
VC++2010のOpenMPの最適化について質問です

ttp://ideone.com/sauMa

上記のコードをVC++ 2010、MinGW(gcc 4.5.2)それぞれで実行速度を測ってみました、
VC++は Relaseモード、
MinGWは -O2オプション付加、
共にOpenMPを有効化した状態です。

この時にOpenMPを使ったコードを有効化すると、
VC++の通常(直列)ループの実行速度が遅くなり、
MinGWは変化ありませんでした。

さらには、ループをインクリメントからデクリメントのループ(for (mytype i = max; i >= Min; i--))に修正して、
OpenMPを使ったコードを有効化すると、
VC++の通常(直列)ループの実行速度がさらに速くなり、
MinGWの通常(直列)ループの実行速度が遅くなる、

という、環境によってバラバラになってしまいました、
これはOpenMPの最適化がコンパイラの実装依存というのが関係しているからでしょうか、
だとしたらOpenMPを使うと環境毎のコードの修正が大変になることになってしまいます。
649デフォルトの名無しさん:2011/06/29(水) 20:25:34.98
>>643
目的はなんだろう?
学習?
そこんとこを質問したほうが早い解決じゃないだろうか
650デフォルトの名無しさん:2011/06/30(木) 01:12:07.36
protectedメンバーってさ、兄弟関係(親子じゃない)にあるpublicじゃない情報取り出せるよね。
あんまりそういやりかたすんのは良くないんだろうか。それともその手の手法が確立されてたりすんだろうか?

class Interface
{
       int value;
protected:
       static int Peek(Interface &target){return target.value;}
};
struct Example:struct Interface
{
        void Parse(Interface &target)
        {
                Peek(target); //targetのvalue値が手に入る
        }
};
651デフォルトの名無しさん:2011/06/30(木) 01:18:10.67
あほすぎるw
1) ExampleはPeekを呼び出せる
2) Peekは内部のint valueの値を返す
これだけのこと。
652デフォルトの名無しさん:2011/06/30(木) 01:28:48.62
そうだよ。それだけのこと。
Interfaceを継承したクラス群は、packageスコープのように値を共有できる。
問題は何に使えるかだ。
653デフォルトの名無しさん:2011/06/30(木) 01:42:31.23
状態遷移があったら使うんじゃん?
654デフォルトの名無しさん:2011/06/30(木) 02:42:58.33
ヘッダでは不要なヘッダをインクルードするなって話がありますけど、
結局の所、shared_ptrなどは公開しないとダメなんですよね?
vectorなどのコンテナなら前方宣言で公開せずに済みますけど。
655デフォルトの名無しさん:2011/06/30(木) 03:19:18.53
C++は組み込み意外の用途で言うと主にどんなときに使われるんでしょうか?
ゲームプログラミングには良く使われることは知っているんですがGUIとか小遣い帳とか言った一般的なアプリケーションを作る分にはC#とかの方が良いんでしょうか?
モチベーションを上げて取り組みたいので出来たらご紹介ください
656デフォルトの名無しさん:2011/06/30(木) 06:27:55.97
>>655
C#のがいいよ
圧倒的に楽に組めるからモチベーションが段違いだよ
657デフォルトの名無しさん:2011/06/30(木) 09:10:14.60
javaがいいよ、java
658デフォルトの名無しさん:2011/06/30(木) 09:18:53.65
>>654
ん?
class Hoge;
shared_ptr<Hoge> fuga;
みたいな話?
659デフォルトの名無しさん:2011/06/30(木) 11:01:22.63
>>655
速度が欲しい大量データ計算処理とか。
660デフォルトの名無しさん:2011/06/30(木) 11:02:41.84
>>654
vector も前方宣言はできないでしょ。
テンプレート引数については逆に、 shard_ptr には渡していいけど vector には渡しちゃダメ。
661デフォルトの名無しさん:2011/06/30(木) 12:22:38.04
>>655
BitComet
662デフォルトの名無しさん:2011/06/30(木) 14:11:03.58
>>655
パズルを解くとかシミュレーションするとか色々あるけど。
663デフォルトの名無しさん:2011/06/30(木) 17:00:32.48
char* a[] = {"a","b","c"};

とあったとき、aの長さ3を得る方法はありますか?
sizeof()を使ってもうまくいかなくて困ってます
664デフォルトの名無しさん:2011/06/30(木) 17:04:07.23
sizeof(a)/sizeof(a[0])は?
665デフォルトの名無しさん:2011/06/30(木) 17:16:19.04
>>664
sizeof(a)という書き方をすると、

 error C2070: 'char *[]': sizeof オペランドが正しくありません。

と出てしまいます。むずかしいです。
666デフォルトの名無しさん:2011/06/30(木) 17:17:45.38
>>665
なるわけねーから動かなかったコード出してみろ
多分前後の文法がおかしいだけだ
667デフォルトの名無しさん:2011/06/30(木) 17:33:30.22
>>663

#define LENGTH_OF(a) (sizeof(hoge((a))))

template <class T, unsigned N> char (& hoge(T const (&)[N]))[N];

int main(void) {

char const * a[] = { "a", "b", "c" };

std::cout << LENGTH_OF(a) << std::endl; // -> 3

return 0;

}
668デフォルトの名無しさん:2011/06/30(木) 17:36:59.86
よく見てみたら配列aを外部宣言してました。すみません。
aの長さを求めたい関数からは、

extern char *a[];

しか見えないため、このようなエラーが出てしまったようです。
669デフォルトの名無しさん:2011/06/30(木) 17:43:35.86
(#^ω^)ビキビキ
670デフォルトの名無しさん:2011/06/30(木) 17:52:08.50
671デフォルトの名無しさん:2011/06/30(木) 18:34:47.58
>>663
std::arrayやboost::arrayを使う手段もあるぞ、参考までに
672>>654:2011/06/30(木) 19:54:31.60
この場合の話なんですけどね。

namespace std
{
  template < class T > class allocator;
  template < class T, class Allocator > class vector;
};

class Hoge
{
private:
  std::vector* m_pArray;
};

メンバ変数にvector保持する時、ポインタにして前方宣言すれば#include <vector>をヘッダに書かなくて住みますよね。
つまり公開せずに済む。
ところがshared_ptr系って、shared_ptrへのポインタを保持したら本末店頭なので、
結局、スマートポインタってのは公開しなくちゃならないんですよね?
673デフォルトの名無しさん:2011/06/30(木) 20:08:22.88
そんなことするとエラー出ると思う
674デフォルトの名無しさん:2011/06/30(木) 20:09:22.66
std::vector* m_pArray;
これは冗長な書き方な気がするけどなぁ
675デフォルトの名無しさん:2011/06/30(木) 20:13:48.65
std::vector* m_pArray;
こんなこと無理じゃね?
676デフォルトの名無しさん:2011/06/30(木) 20:32:46.08
>>672
必ずしも公開しないとだめということはないよ
やろうと思えばすべてのクラスで定義を隠蔽できる
メリットよりデメリットのほうが多いからやる価値は無いけどね
677デフォルトの名無しさん:2011/06/30(木) 20:58:26.60
>>672
何を言ってるのか良く分からないから
他人にも通じる言語(日本語でもいいよ)で
どんな事がしたいのか説明してみたら?
678デフォルトの名無しさん:2011/06/30(木) 21:24:59.23
>>672
こういうことを言いたいってことだよな
ttp://ideone.com/Aao2X
ただstdの一部を取り出して前方宣言は基本的にすべきでないし、
するメリットも少ない
679デフォルトの名無しさん:2011/06/30(木) 22:46:58.94
自前のと外部ライブラリの operator new がバッティングした場合のうまい対処法ってありますか?

今はライブラリインクルード前に自前のをundefして後にまたdefineし直しで対処してるんですが・・・
680デフォルトの名無しさん:2011/06/30(木) 22:50:54.74
つ名前空間
681デフォルトの名無しさん:2011/06/30(木) 22:56:19.20
ごめん、うそついた
682デフォルトの名無しさん:2011/06/30(木) 23:00:59.07
namespace foo
{
namespace
{}
}

名前空間の中に無名名前空間を作っても大丈夫ですか?
VC2008だとなぜかIntelliSenseが効かなくなることがあります。
683デフォルトの名無しさん:2011/07/01(金) 01:16:54.41
>>672
> メンバ変数にvector保持する時、ポインタにして前方宣言すれば#include <vector>をヘッダに書かなくて住みますよね。

ダメ。ユーザープログラムが namespace std に宣言を行った場合、未定義動作になる。

17.4.3.1 [lib.reserved.names] p1 (C++2003)
"It is undefined for a C++ program to add declarations or definitions to namespace
std or namespaces within namespace std unless otherwise specified."

17.6.4.2.1 [namespace.std] p1 (N3290)
"The behavior of a C++ program is undefined if it adds declarations or definitions to
namespace std or to a namespace within namespace std unless otherwise specified."
684デフォルトの名無しさん:2011/07/01(金) 01:19:33.38
>>679
#undef で対処してるってことは、そのライブラリも自前のコードも両方 #define new ... してるの?
ひどい状況だね。

ライブラリのそれが迷惑だと身をもってわかったんだから、自分でもそんなことするのやめれば?
そもそも #define new ... で何がしたいの?
685>>672:2011/07/01(金) 03:47:17.85
みなさんありがとうございました。

可読性や速度が低下するし、namespace stdだと未定義動作になるようですし(>>683)止めときます。

結局、ユーザに公開するクラスのヘッダだけが隠蔽されてれば問題ない話なんですね。
あー難しい。
686デフォルトの名無しさん:2011/07/01(金) 18:14:37.36
標準だろうがなんだろうが問題なく隠蔽できるよ
そんなの常識的な知識でしょ
687デフォルトの名無しさん:2011/07/01(金) 18:30:10.23
//hpp
class V ;
class hoge { V * pV ; hoge(void) ; } ;

//cpp
#include <vector>
class V : public std::vector<fuga> { } ;
hoge::hoge(void) : pV( new V ) { }
688天使 ◆uL5esZLBSE :2011/07/01(金) 19:52:27.28
>>683
> "The behavior of a C++ program is undefined if it adds declarations or definitions to
↑ハアァアアァァアァアァアアァアァァァァァァアアァアアァァアアァァァァァァァアァ??????????
ゴミって意味わかってんのかなこいつら
689デフォルトの名無しさん:2011/07/01(金) 22:53:58.41
>>672
そこまですんならpimplにすりゃいいんじゃね?
スタックに割り当てなきゃならんのなら別だろうけど。
690デフォルトの名無しさん:2011/07/01(金) 22:56:15.81
>>682
言語上は構わんだろ。そもそも、そうできないと
クラススコープに縛りたい変数やらクラスといったシンボルは
全て広域名前空間で宣言するかちまちまstatic書かなきゃならなくなる。
691デフォルトの名無しさん:2011/07/01(金) 23:28:14.60
unsigned short hoge[4];
hoge[0] = 0x0123; hoge[1] = 0x4567;
hoge[2] = 0x89AB; hoge[3] = 0xCDEF;

リトルエンディアンの環境では
[MSB] 23 01 67 45 AB 89 FE CD [LSB]
になるけど、ビッグエンディアンの環境では
[MSB] 01 23 45 67 89 AB CD EF [LSB]
になる?
692デフォルトの名無しさん:2011/07/01(金) 23:46:21.07
short intが2バイトの環境ならそうなるね
693デフォルトの名無しさん:2011/07/01(金) 23:51:18.78
なるほど。ありがとう
694デフォルトの名無しさん:2011/07/02(土) 15:34:41.33
shared_ptr intrusive_ptrの使い分けの仕方を、説明してホスイ
695デフォルトの名無しさん:2011/07/02(土) 15:40:46.27
>>694
いやそんな使い分けに困るようなもんでもないと思うんだが
intrusive_ptrの使い方は分かってるんだよね?
696デフォルトの名無しさん:2011/07/02(土) 15:49:51.56
>>694
shared_ptrは楽で既存のクラスにも簡単に適用できて多機能でプログラマのミスでリークすることは殆ど無い。けど生ポとの共存が面倒でその手の応用が効きにくく、さらに無駄が多い
intrusive_ptrはめんどくさいし既存のクラスには適用できないしプログラマのミスでリークするかもしれない。けど生ポと簡単に共存ができるし、無駄が少ない。
697デフォルトの名無しさん:2011/07/02(土) 15:59:34.34
すいません。new/delete でご意見をきかせてください。

コードはこちらです。http://www.amazon.co.jp/dp/4797327030/ の最初の Iterator パターンを C++ で書き直したものです。
http://codepad.org/hrU82H5x

ここでは、new/delete 忘れを検出するべく、new/delete をオーバーロードして malloc()/free() に振りなおしています。
さらに、malloc()/free() に対しては、xmalloc()/xfree() なるラッパを間に通しており、最終的に malloc()/free() 忘れや二重解放を拾い上げられるようにしています。
ラッパの実装は双方向リストを使用しています。
#宿題スレでよく使用しておりお見かけの方がおられるかもしれません。

ここで次のような事態が発生しました。解放忘れや二重解放はなんとか排除できたのですが、
※「クラスのスタティックなメンバ関数としての new で確保した領域が、グローバル関数として定義した delete で解放されている」
処理系によってはそういうことがある、と考えていいのでしょうか?それとも書きように問題が残っているのでしょうか。

---
上のソースでは、
278行目 Iterator<Book> *itr = bookShelf->iterator(); //(a)
233行目 Iterator<T> *iterator(); //(b);
269行目 return new ConcreteIterator<T>(this); //(c)
の道筋で最終的に確保された動的領域を、
283行目 delete itr; //(d)
で解放したのですが、実行結果を見る限り、これは、
136行目の void operator delete(void *p) {
にきているようです。

こちらの環境/処理系は gcc 4.3.4 / cygwin on Windows XP です。
ご意見をお聞かせいただければ幸いです。よろしくお願いいたします。
698デフォルトの名無しさん:2011/07/02(土) 16:11:51.08
>>695>>696thxです
winsockを使ってみる。(1)
http://www.kmonos.net/alang/boost/smartptr.html
winsock を侵入型参照カウンタとintrusive_ptrを使って、実装しているサンプルが
掲載してあるのですが、winsok のインスタンスをつくるのに、インターフェース
クラスを作成し、間接的にnew して、winsok のインスタンスを作っています、
コンストラクタでintrusive_ptr を使ってメモリ管理をしています、
面倒そうに視えるのでshared_ptr では、ダメなのだろうかと思って質問しました。
699デフォルトの名無しさん:2011/07/02(土) 16:29:16.26
>>697
仮想デストラクタ
700デフォルトの名無しさん:2011/07/02(土) 16:30:59.09
テストプログラムを作ったんですがうまく動きません 助けて
#include<iostream>
using namespace std;

class cord{
public:
int x,y;
cord operator+(cord o);
cord(int i=0,int x=0){x=i,y=x;} };
cord cord::operator+(cord o) {
cord tem;
tem.x=x+o.x; tem.y=y+o.y;
o.x=0; return tem; }
int main(){
cord w(1,1),r(9,1),o;
o=w+r;
cout<<o.x<<','<<o.y<<"ここまでテキスト\n";
cout<<r.x;
char p;
while(p=getchar()!='o');
return 0; }
コンパイルは通るんですが計算の実行結果が意味不明なので原因を教えてください
<<実行結果>>
-1717986920,10ここまでテキスト
-858993460

701デフォルトの名無しさん:2011/07/02(土) 16:35:50.86
int x,y;
cord(int i=0,int x=0){x=i,y=x;} };
702デフォルトの名無しさん:2011/07/02(土) 16:43:51.48
cord(int i=0,int x=0)
{
x=i,
y=x;
}
};

ここでcord.xとcord.yに値を入れているのだろうが引数のxと文字が被っているからcord.xに入っていない
703デフォルトの名無しさん:2011/07/02(土) 16:48:51.93
なんでiと来て次がxなのか意味不明すぎて笑ってしまった
704デフォルトの名無しさん:2011/07/02(土) 16:51:05.33
>>700
もう少し丁寧に書けば簡単に正しいコードがかけるのでは?
ttp://ideone.com/SsahX
705704 :2011/07/02(土) 16:58:39.80
operator+にconstつけてなかった
706デフォルトの名無しさん:2011/07/02(土) 17:02:05.26
#include<iostream>

class Coord {
public:
 Coord(int x = 0,int y = 0)
  : x(x), y(y) {
// this->x = x;
// this->y = y;
 }

 Coord Coord::operator +(Coord & rhs) const {
  Coord t(this->x + rhs.x, this->y + rhs.y);
  rhs.x = 0; // ?
  return t;
 }

 int x, y;
};

int main() {
 Coord w(1, 1), r(9, 1), o;
 o = w + r;
 std::cout << o.x << ',' << o.y << "ここまでテキスト\n";
 std::cout << r.x;
 while (getchar() != 'o') {}
 return 0;
}
707デフォルトの名無しさん:2011/07/02(土) 17:06:27.15
もっとちゃんとやるなら
Coord Coord::operator +(const Coord & rhs) const {
708デフォルトの名無しさん:2011/07/02(土) 17:07:51.81
> cord(int i=0,int x=0){x=i,y=x;} };
1. 引数 x に引数 i を代入する
2. メンバ変数 y に 引数 x を代入する
3. この地点でメンバ変数 x は初期化されていない
709デフォルトの名無しさん:2011/07/02(土) 17:19:27.89
あいまいさが生じたのか
コンパイラはエラーださないんですね
ありがとうございます
710デフォルトの名無しさん:2011/07/02(土) 17:21:42.14
C++で関数型言語みたいに書けますか?
711デフォルトの名無しさん:2011/07/02(土) 17:30:56.61
boost::function
boost::lambda
boost::bind等などとか?
712711 :2011/07/02(土) 17:33:05.72
713デフォルトの名無しさん:2011/07/02(土) 17:38:31.42
>>699
的確なコメント感謝いたします。

g++-3 で警告※がでる理由がわかりませんでしたが、コンパイラによっては、仮想クラスから派生したクラスのデストラクタが呼ばれないことがあるのですね。
※ warning: `class Array<Book>' has virtual functions but non-virtua destructor
http://codepad.org/YIc9esVA
714デフォルトの名無しさん:2011/07/02(土) 17:53:35.00
class Base {
public:
 Base() { printf("Base();\n"); }
 ~Base() { printf("~Base();\n"); }
};

class Derived : public Base {
public:
 Derived() { printf("Derived();\n"); }
 ~Derived() { printf("~Derived();\n"); }
};

int main() {
 Base * pBase = new Derived;
 delete pBase;
}

出力:
Base()
Derived()
~Base()

で正しい。~Derived() は呼ばれるはずがない
Base クラスのデストラクタが Derived クラスでオーバーライドされていないので、pBase が delete される時に呼ばれるのは Base クラスのデストラクタになる
オーバーライドするためには Base クラスのデストラクタを仮想化する必要がある
715デフォルトの名無しさん:2011/07/02(土) 18:04:30.20
しかしこうしてみると、仮想デストラクタを持たないクラスを継承することがどれだけ危険か分かるな・・・
716デフォルトの名無しさん:2011/07/02(土) 18:17:20.16
>>713
お前QZだろ?まあいい、C++スレでは目をつぶっててやる

CodeGuardを掛けたら次のようなエラーが出ている

Error 00001. 0x400000 (Thread 0x0DB8):
Exception 0xC0000005: Access violation at 0x14B4677.
Call Tree:
0x0CD1E0DA(=CG32.DLL:0x01:01D0DA)
0x0CD15098(=CG32.DLL:0x01:014098)
0x0CD1602E(=CG32.DLL:0x01:01502E)
0x0CD2783E(=CG32.DLL:0x01:02683E)
0x0CD011BF(=CG32.DLL:0x01:0001BF)
0x7C9624CA(=ntdll.dll:0x01:0214CA)
0x7C81CAAE(=kernel32.dll:0x01:01BAAE)
0x7C81CB26(=kernel32.dll:0x01:01BB26)
0x32B9C0C8(=CC32110MT.DLL:0x01:09B0C8)
0x32B9911B(=CC32110MT.DLL:0x01:09811B)
0x32B9914C(=CC32110MT.DLL:0x01:09814C)
0x32B98DCE(=CC32110MT.DLL:0x01:097DCE)
0x32B98E4D(=CC32110MT.DLL:0x01:097E4D)
0x004017A9(=iterator1.exe:0x01:0007A9) iterator1.cpp#165
0x00403B4A(=iterator1.exe:0x01:002B4A) iterator1.cpp#190
717デフォルトの名無しさん:2011/07/02(土) 18:18:20.62
>>714は実際の一般的な挙動を説明してるだけだろうけど

>>713はコンパイラによってはそうなってる見たいとか言ってるから言っとくが
規格では未定義だから, pBase にDerivedクラスを突っ込んでdeleteした時点アウトだからな
絶対にやってはいけないことだからね
718デフォルトの名無しさん:2011/07/02(土) 18:23:08.24
別に問題ねーよ
ちゃんとメモリも解放されるし
基底クラスのデストラクタにvirtual付けてないともちろんダメだけど
719デフォルトの名無しさん:2011/07/02(土) 18:36:35.77
>>718

vitrual付いてない時の話に決まってるだろ
その話をしてるんだが
>>713のコードではvirtual付いてるから勘違いしたのか?
720デフォルトの名無しさん:2011/07/02(土) 18:38:51.74
スマポ使うんでvirtualはいりません
721デフォルトの名無しさん:2011/07/02(土) 18:41:38.25
>>719
virtual付いて無いときって書いて無かったから勘違いしてた
ごめん
722デフォルトの名無しさん:2011/07/02(土) 18:59:30.47
仮想デストラクタを持たない基底クラスのポインタに派生クラスを代入して、それをdeleteした時の動作って未定義だったのか
ふっ、また1つ賢くなってしまったよ
723デフォルトの名無しさん:2011/07/02(土) 19:01:49.13
ひとつ人間に近付いたね
724デフォルトの名無しさん:2011/07/02(土) 19:33:55.33
>>722
687か?w
725 ◆QZaw55cn4c :2011/07/02(土) 19:39:11.73
>>716
そのとおりです。コードみればそのまんま自明でもあります。
肝心の基底クラスのデストラクタがvirtual でなかったので訂正します。http://codepad.org/5hxUbKLP

でも、そのcodeguard って bcc のやつでしょう?bcc55 はこちらでもコンパイル結果は謎(return 0; のあとで new/delete が呼び出されてます)です。
そのコールトレースをみると、kernel32 のまだ下の dll でエラーが出ているようだし、あんまり信用できないなあ。

>>717
ありがとうございます。理由がわかるにはまだ知識が足りませんがよく覚えておきます。
726デフォルトの名無しさん:2011/07/02(土) 19:42:16.74
>>710 Boost.Phoenix
727デフォルトの名無しさん:2011/07/02(土) 21:40:32.94
>>725
俺の使ってる奴はbcc(今はecc)の最新版、ecc6.3.1だよカス
バグだらけのbcc5.5と一緒にすんな

明らかに自分のコードが間違っているのに人のせいにするなんて
やっぱりクズだよお前
728デフォルトの名無しさん:2011/07/02(土) 21:42:33.46
>>725
それからそのコードまだこんなエラーが出るぞ

Error 00001. 0x400000 (Thread 0x0E24):
Exception 0xC0000005: Access violation at 0x14B4677.
Call Tree:
0x0CD1E0DA(=CG32.DLL:0x01:01D0DA)
0x0CD15098(=CG32.DLL:0x01:014098)
0x0CD1602E(=CG32.DLL:0x01:01502E)
0x0CD2783E(=CG32.DLL:0x01:02683E)
0x0CD011BF(=CG32.DLL:0x01:0001BF)
0x7C9624CA(=ntdll.dll:0x01:0214CA)
0x7C81CAAE(=kernel32.dll:0x01:01BAAE)
0x7C81CB26(=kernel32.dll:0x01:01BB26)
0x32B9C0C8(=CC32110MT.DLL:0x01:09B0C8)
0x32B9911B(=CC32110MT.DLL:0x01:09811B)
0x32B9914C(=CC32110MT.DLL:0x01:09814C)
0x32B98DCE(=CC32110MT.DLL:0x01:097DCE)
0x32B98E4D(=CC32110MT.DLL:0x01:097E4D)
0x004017A9(=iterator2.exe:0x01:0007A9) iterator2.cpp#138
0x00403BFA(=iterator2.exe:0x01:002BFA) iterator2.cpp#163

直ってないんじゃないか?
729デフォルトの名無しさん:2011/07/02(土) 21:45:10.69
>>697
new/delete 忘れを検出するんじゃなくて、 RAII 使って防げば良いのに。
730デフォルトの名無しさん:2011/07/02(土) 21:49:10.80
メモリの解放忘れだったら、STLのstringや自作クラス使えばいいだろ。
あとページコレクションのツールと使うとか。
731デフォルトの名無しさん:2011/07/02(土) 21:51:05.97
今だにスマートポインタ使うの渋るのがいる。なんで?
732デフォルトの名無しさん:2011/07/02(土) 21:52:34.40
>>731
コスト
733デフォルトの名無しさん:2011/07/02(土) 21:53:16.70
>>731
ロートルだからさ
734デフォルトの名無しさん:2011/07/02(土) 21:54:27.30
だなあ、未だにPentiumVの850MHzなんて化石ノート使ってるようじゃ
コストは馬鹿にならないだろうなあ

エアフェノム使ったらどう?w
735デフォルトの名無しさん:2011/07/02(土) 21:54:56.92
スマートポインタのコストがボトルネックになってるのかよ。そんな奴はクビにしろ
736デフォルトの名無しさん:2011/07/02(土) 21:55:19.55
new/deleteを自分で管理出来ないのが意味分からん。
スマポに頼ろうという発想が出てこない。
オブジェクトの生成期間なんぞ、明白だし、
明白で簡潔であるべきだ。
737デフォルトの名無しさん:2011/07/02(土) 21:56:28.37
>>735
クビって言うか、こいつ無職ですから
738デフォルトの名無しさん:2011/07/02(土) 21:56:34.29
C++に来ないで一生C言語に篭ってろよ
739デフォルトの名無しさん:2011/07/02(土) 21:56:45.89
unique_ptrでおk
740デフォルトの名無しさん:2011/07/02(土) 21:56:54.65
>>736
そりゃ何故スマポなのか?を理解出来てないだけだろ。
741デフォルトの名無しさん:2011/07/02(土) 21:59:36.63
>>736
ム板にこういうスレを懲りずに3回も立ててる奴ですから、どんな奴かは推して下さい

【モリタポ有償】C/C++/Java の問題を片付けます(3)
http://hibari.2ch.net/test/read.cgi/tech/1309527259/
742デフォルトの名無しさん:2011/07/02(土) 22:02:12.30
C++の哲学をわかってないやつが多すぎるな
「いらないコストは払わない」
基本中の基本だろ
スマポはこの哲学を完全に無視してんだよ
特にboost::shared_ptrテメーは最悪だ
743デフォルトの名無しさん:2011/07/02(土) 22:03:31.17
ちがうだろ。
CPUに関係が無い。
コスト=計算量は。
744デフォルトの名無しさん:2011/07/02(土) 22:04:08.88
スマポは消臭剤に似てる。
悪臭を消すために振り掛ける。

しかし、本当は、それに頼らず、
元の悪臭を断つべきなのだ。
745デフォルトの名無しさん:2011/07/02(土) 22:05:31.52
>>742
ほおー
スマポを使わずにどうやってRAIIを実現すると?
746デフォルトの名無しさん:2011/07/02(土) 22:07:03.57
GCが標準にないC++にとってスマポは必要悪である事もしらないアホがいるのか
とっとと墓穴掘って埋まってくれ
747デフォルトの名無しさん:2011/07/02(土) 22:07:54.06
>>745
0初期化とデストラクタで十分だろうが
748デフォルトの名無しさん:2011/07/02(土) 22:09:24.67
>>747
ほとんどC++を使う理由がないような・・・
749デフォルトの名無しさん:2011/07/02(土) 22:10:11.03
あっそうかわかった、こいつはメモリリークやリソースリークに鈍感な奴なのかw
750デフォルトの名無しさん:2011/07/02(土) 22:12:37.49
リークさせないなんて出発点でしかないんだが…。
751デフォルトの名無しさん:2011/07/02(土) 22:13:27.59
バグが出ない前提で語るアホ
752デフォルトの名無しさん:2011/07/02(土) 22:14:06.17
これ、char *buf = new char [1024]; と bufを

string buf(1024,'\0'); と &buf[0] で置き換えたら

メモリリークしないが。
 
753デフォルトの名無しさん:2011/07/02(土) 22:15:34.15
stringはSTLに近い
文字列コンテナと言ってもいい
という事はお前はコンテナは使う前提で話をしているって事でいいんだな?
754デフォルトの名無しさん:2011/07/02(土) 22:16:15.19
>>751
QZはリークさせまくっても平気な奴らしいですから
そこら辺が職業PGとアマグラマの一番の差でしょうね
755デフォルトの名無しさん:2011/07/02(土) 22:17:20.16
必要なところで使う。必要ないところでは使わない
みんなこんな根本的なところからわかってないんだなぁ
756デフォルトの名無しさん:2011/07/02(土) 22:19:10.24
>>748
むしろ C++ を使う理由につながる
おまえさんの言う「C++ を使う理由」とは?
757デフォルトの名無しさん:2011/07/02(土) 22:20:34.31
>>756
開発期間を短くしてしかも出来るだけ初めからバグの発生確率を
低くするためだと思う

そういうと「お前はJavaかC#でも使ってろ」と言われそうだが
758デフォルトの名無しさん:2011/07/02(土) 22:20:34.69
横からだが、C++を使う理由はカプセル化と、
STLのささいなクラスライブラリを使いたいからだな。
759725:2011/07/02(土) 22:22:15.95
>>727,728
これは失礼。
> Exception 0xC0000005: Access violation at 0x14B4677.
> Call Tree
> 0x0CD1E0DA(=CG32.DLL:0x01:01D0DA)
> 0x0CD15098(=CG32.DLL:0x01:014098)

> 0x7C9624CA(=ntdll.dll:0x01:0214CA)
> 0x7C81CAAE(=kernel32.dll:0x01:01BAAE)
> 0x7C81CB26(=kernel32.dll:0x01:01BB26)
> 0x32B9C0C8(=CC32110MT.DLL:0x01:09B0C8)

> 0x32B98E4D(=CC32110MT.DLL:0x01:097E4D)
> 0x004017A9(=iterator2.exe:0x01:0007A9) iterator2.cpp#138
> 0x00403BFA(=iterator2.exe:0x01:002BFA) iterator2.cpp#163

これが何を意味するのかちょっとだけ教えていただけませんか?
確かに、#163->#138 ときて、そのあといきなり(>>725 の#75〜#123の間の、#97, #98, #109, #110 などを飛び越えて)スレッドセーフなランタイム?に入り、kernel32, nttdll まできてさらに下の得体のしれないところで例外が発生しているのでしょうか?

0x14B4677 というのはどこを指しているのでしょうか?
>>725 の #163 といえば、class BOOK { char *name; の解放になりますが、こちらの観測では二重解放もしていないようですし、いったい何が起こっているのでしょうか?

もしかして、#95- #96, #107-#108 の
for (i = 0; i < q->size; i++)
*(char *)((char *)(q->data) + i) = (char)(rand() & 0xff);
が悪いのか?
760デフォルトの名無しさん:2011/07/02(土) 22:22:54.99
C++なんてやめてD言語やればみんな幸せになれる
761デフォルトの名無しさん:2011/07/02(土) 22:24:12.50
>>759
Call TreeというのはDLLを呼び出した階層順の事
だからkernelで例外が起きているわけではない

0x14B4677というのは初期化されてないポインタにでも
アクセスしてるんじゃないか?
762デフォルトの名無しさん:2011/07/02(土) 22:26:21.77
ちなみにCodeGuardはわざとエラーを発見しやすくするために、未初期化データセクションに
ランダムな値を書き込む

多分0x14B4677というのはCodeGuardが書き込んだ値だろう
763デフォルトの名無しさん:2011/07/02(土) 22:27:51.19
まあなんかスマートで新しい低レベル言語作ったほうがいいってのはあるよな
C++0xなんてどこの悪質建築業者のやっつけ増改築だよって思う
過去の資産がどうのこうの言うけどそんなもんあっという間に追いつくよ
764デフォルトの名無しさん:2011/07/02(土) 22:28:56.00
>>763
さぁD言語の扉を開けるんだ
765デフォルトの名無しさん:2011/07/02(土) 22:30:14.53
>>757
えっ?? C++ を使ったらバグの発生確率が下がるのか?

# どんな分野なんだろう

>>758
煽りうめえw
766デフォルトの名無しさん:2011/07/02(土) 22:32:22.07
お前何のためにEffective C++やExceptional C++のような本が出てると
思ってるんだ?

Pimplイディオムの存在理由は分かるか?
767デフォルトの名無しさん:2011/07/02(土) 22:33:17.87
このバカがそんな本読んでるわけ無いだろ
768デフォルトの名無しさん:2011/07/02(土) 22:33:55.10
>>763
CPUで言うとx86をARMで置き換えようっていうのに似てるな
ARMはスマートフォンなどに確実に浸透してきているし、サーバー機にも使われ始めた
Intelは焦っているに違いない
769デフォルトの名無しさん:2011/07/02(土) 22:34:04.01
ヘッダを実装の変更から切り離すためだろ?>pimpl
770デフォルトの名無しさん:2011/07/02(土) 22:34:54.69
しかし立場が危うくなると慌ててコテを外す当たり本当に小物だと思うわ
771デフォルトの名無しさん:2011/07/02(土) 22:34:58.56
この流れでpimplとか何も理解してないとしか思えないな
772デフォルトの名無しさん:2011/07/02(土) 22:37:37.37
>>763
new の時点から姉歯臭してたが
773デフォルトの名無しさん:2011/07/02(土) 22:39:35.73
>>768
AndroidはオープンアーキテクチャだしCPUを選ばないからさらに強敵だな
これがPC層まで浸透してくると怖いものがある

事実MSもARMやAndroidにシフトしてきてるし
774デフォルトの名無しさん:2011/07/02(土) 22:43:21.27
もう Google Go しかないな
775デフォルトの名無しさん:2011/07/02(土) 22:50:47.20
>>773
それでも開発言語はC/C++なんだよなあ
776デフォルトの名無しさん:2011/07/02(土) 22:51:43.01
>>747
それで例外安全に出来るのか?
777デフォルトの名無しさん:2011/07/02(土) 22:52:51.73
>>776
もちろん
君は出来ないの?
778デフォルトの名無しさん:2011/07/02(土) 22:56:03.61
>>777
すごく大変だと思わないか?スマポなしでやると
779デフォルトの名無しさん:2011/07/02(土) 22:58:49.89
俺は絶対にミスしないからスマポは必要無い!キリッ
780デフォルトの名無しさん:2011/07/02(土) 23:00:06.42
開発時間や開発効率は無視するわけですね
さすがプロは言う事が違うな
781デフォルトの名無しさん:2011/07/02(土) 23:00:22.80
実行時のコスト >>>> バグのリスク/プログラマの時間・作業的負担
な環境か、C++上級者だらけの羨ましい職場かのどっちかなんでしょ?
天国と地獄だなw
782デフォルトの名無しさん:2011/07/02(土) 23:02:08.99
ミスをするからスマポに頼る、ってのが悲しい間違い。
783デフォルトの名無しさん:2011/07/02(土) 23:02:59.48
どうでもいいけどみんなカルシウム足り無すぎやで
次の質問をどうぞ
784デフォルトの名無しさん:2011/07/02(土) 23:05:13.63
pimplってどう発音するんですか?
RAIIとかも
テクニックの略語はどう読んでいいのか・・・
785デフォルトの名無しさん:2011/07/02(土) 23:05:27.10
1バイトの増加も許されない組み込み環境にC++を使うのは間違いやぞ
基本的にC++は富豪プログラミング思想だからな
アセンブラでも使ってろくそったれ
786デフォルトの名無しさん:2011/07/02(土) 23:05:43.98
スマポの存在意義を完全に無視してるな。どういう現場なんだよ。
787デフォルトの名無しさん:2011/07/02(土) 23:11:28.16
>>778
いや、全然
788デフォルトの名無しさん:2011/07/02(土) 23:17:30.08
>>785
俺はEmbedded C++を使わされる事になった時発狂しそうになったぞ
でもそれでおまんま食わせてもらってるから文句言えない
789デフォルトの名無しさん:2011/07/02(土) 23:19:52.92
文句言えよ
言わないと永遠に生きてるコード生成プログラム扱いだぞ
790デフォルトの名無しさん:2011/07/02(土) 23:23:23.67
boostはいらねえ。
メモリリークを無くしたいならば、PHP、Javascriptを使えばいい。
ほとんどC/C++と同じ事はできるだろ。
791デフォルトの名無しさん:2011/07/02(土) 23:25:47.14
使えばいいで使わせてくれるような現場なのか。
792デフォルトの名無しさん:2011/07/02(土) 23:29:14.96
設計が下手くそだからリークなんて起こすんだろうな
マトモな設計してれば論理的なリークなんてすぐになくせる
あとはコーディング段階でのうっかりぐらいしかリークする余地はないけど
これもデバッグ段階でリークしてる箇所がズラッと一覧で出るから普通は見逃しようがない
793デフォルトの名無しさん:2011/07/02(土) 23:30:02.80
PHPをC++に翻訳するツールがあるが。
翻訳部分にバグが無かったからメモリーリークもしないだろう。
あと、PHPコードをC/C++から呼び出す事もできるが。
794デフォルトの名無しさん:2011/07/02(土) 23:46:06.61
なにやらLLVMが活性化してる感じがするけど、
そもそもJavaのバイトコード吐き出せるC++コンパイラーって作れないのか?
わざわざ別のVM作るより速いだろうに。
795デフォルトの名無しさん:2011/07/02(土) 23:53:23.92
スレチ
796725:2011/07/03(日) 00:00:50.06
>>729
キーワードの提供ありがとうございます。
ただ、>>697 の URL のとおり、Java の書籍を通してやっとデザパタを理解しようとしているレベルに過ぎないところお察しくだされば。
スマートポインタの概念を理解するのも、今の段階では夢のまた夢‥‥‥。

それにしてもなんだか盛況ですね。
797デフォルトの名無しさん:2011/07/03(日) 00:04:08.65
デザパタの原典はC++だからそっち読んだら?
798デフォルトの名無しさん:2011/07/03(日) 00:08:25.91
>>796
みんなわざわざ空気悪くするようなカキコしなくてもいいのにな
自分も気分悪いし、相手も気分悪い、第三者も気分悪い、
百害あって一理なしだな

スマポは考え方自体はすごくシンプルよ、
より良く実装するのが難しいだけで
799デフォルトの名無しさん:2011/07/03(日) 00:42:58.33
何で加速してるんだと思ったら宗教戦争かよwwwww
状況によって使い分ければいいだろwwwww

ただし、たけのこの里が好きな奴は味覚障害でどうしようもない
800デフォルトの名無しさん:2011/07/03(日) 00:56:36.20
きのことか舌切り取った方がいいよ
801デフォルトの名無しさん:2011/07/03(日) 02:20:12.19
>>796
スマポを知りたければ、Modern C++ Designや
C++テンプレートメタプログラミングを読んでみれば良い。
802725:2011/07/03(日) 02:42:21.60
>>761,>>762
コールツリーというからには、やっぱりスタックに積まれている戻り先(およびスタック上のローカル変数を取り除くため ebp 値)をチェックしているような気がします。
CG32.dll というのは、CodeGuard の dll で、バージョン6 ともなると、カーネルの下に潜っているのかも。
>> 0x0CD1E0DA(=CG32.DLL:0x01:01D0DA)
>> 0x0CD15098(=CG32.DLL:0x01:014098)

BCC5 くらいの手元の codeguard では、でたらめポインタのアクセスは捕らえられず、new/delete しかチェックしてくれないみたい。
また、global な new を補足してしまうと、こちらの手元の codeguard 的にはまずいようです。@

あと、
p = new char [ n ];
したものは、
delete [] p;
としないといけませんでしたね。この点は怒られてしまった。A

@Aについてだけ対応したものを残しておきます。http://codepad.org/gMI6MnFz codepad 上でも無事コンパイルがとおり実行結果まで得られるようになってめでたしめでたし。
803デフォルトの名無しさん:2011/07/03(日) 03:07:44.34
>>802
それが当たり前だろ
何がめでたしめでたしだ
しかし嘘もほどほどにしとけよ
フリー版のbcc5.5にはCodeGuardは付属していなかった
俺はC++Builderをバージョン4の時から買い続けているから良くこの事を知っている
どこまで信用の置けない奴なんだQZは
詐欺師か
804デフォルトの名無しさん:2011/07/03(日) 03:16:15.98
スマートポインタのコストとか言ってるやつは具体的に何のこと言ってるの?
std::auto_ptr や boost::scoped_ptr や std::unique_ptr<T, default_delete(?)> なら
空間コストも実行時間コストも生ポインタと同じだよね?
805デフォルトの名無しさん:2011/07/03(日) 03:34:31.17
>>803
bcc5.6(C++Builder6)の製品版が手元にあります。delphi もろとも買ってはみたものの、もともと win16api で止まってしまった人なのでほとんど使わずかつ使えなかったのですが。

>それが当たり前だろ
まあそうなんですが、まだまだ C++ はよくわからないし、警告やエラーがあっても、それより別の内容をお聞きしたくて参上した次第。初学者によくあることとして容赦してくださいな。
806デフォルトの名無しさん:2011/07/03(日) 03:56:35.88
>>805
あれ?さっきはbcc5.5と言っていましたよね?
いつからbcc5.6にすげ替わったのですか?
もう、いいですよ
あんたの言ってる事は信用が出来ない
807デフォルトの名無しさん:2011/07/03(日) 03:59:54.45
ある一つの嘘を付いてしまうと、その嘘を隠すためにまた一つ別の嘘を付かなくてはならなくなる
しかし、分かる人には分かるんですよ、ちゃあんとね
見え透いたハッタリから足を洗ったらどうですか?
808デフォルトの名無しさん:2011/07/03(日) 06:55:25.10
>>806
当初はフリーの bcc55 を使用していましたが、いよいよ codeguard の結果を見なくては、と考え、どこぞに放置していた Borland C++Builder 6.0 Professional (Build 10.157)(1983-2002) (bcc32 は 5.6) をインストールした、という経緯ですが何か矛盾していますでしょうか?

>>728
> 0x32B98E4D(=CC32110MT.DLL:0x01:097E4D)
> 0x004017A9(=iterator2.exe:0x01:0007A9) iterator2.cpp#138
>>728 提供のデータが正しければ、これは>>725(http://codepad.org/5hxUbKLP) #138 から xfree() に入ったあと、暗黙に直接ライブラリをコールしていることを示しています。
グローバルな new をオーバーロードすること自体が悪いのか、delete [] name; と書かずに delete name と書いてしまったのが悪いのか、というところでしょうか。
809デフォルトの名無しさん:2011/07/03(日) 07:52:18.65
>>808
じゃお前のCodeGuardの出力を貼ってみろよ
810デフォルトの名無しさん:2011/07/03(日) 07:59:06.29
ちなみにC++Builder6はUpdate4まで出ているんだが、正規ユーザーなら
もちろんダウンロード出来るはずだよな?
そしてそれを当てた時のBCCのバージョンを書いてみろ?
811デフォルトの名無しさん:2011/07/03(日) 08:45:40.10
>>809
http://codepad.org/URao2WZ6http://codepad.org/SO8vcahk (多すぎて全部載らない)
http://codepad.org/xXrBYThGhttp://codepad.org/UOwZTF1y (問題は見受けられない。)
両者は134行目が異なります。
いずれも bcc32 のコマンドラインオプションに -vG -v を指定して得られた .cgl の内容です。
bcc5.6 の codeguard は、 new/delete をオーバーロードするとうまくいかない場合があるんじゃないかと考えています。
そういう仕組みなら仕方がない。

>>810
そこまでお付き合いするつもりはないのですが、普通に考えれば 5.6.4 じゃないですか?
812デフォルトの名無しさん:2011/07/03(日) 08:49:09.96
正直どうでもいい。
813811 ◆QZaw55cn4c :2011/07/03(日) 08:54:17.99
>>812
まったく。
814デフォルトの名無しさん:2011/07/03(日) 10:30:13.76
>>811
普通に考えれば?妙な言い方をしますなあ
割れ厨だからダウンロードできないと素直に言えばいいのに
言う事がどんどん変わって行ってますね

5.6.4のnew/deleteには確かに問題があった
しかし今は問題がない
その頃のバグを取り上げて論じても意味がない
815 ◆QZaw55cn4c :2011/07/03(日) 10:43:19.33
816デフォルトの名無しさん:2011/07/03(日) 10:57:29.97
>>815
それは証拠にならない
アップデータを人からもらったかもしれないだろ?
ライセンスキーを晒せとは言えないが、正規のライセンスキーを持っている証拠が
示せなければ身の潔白を証明する事は無理だ
817デフォルトの名無しさん:2011/07/03(日) 11:31:53.97
うざいから他所でやれ。
818デフォルトの名無しさん:2011/07/03(日) 11:39:51.28
>>812==>>817==◆QZaw55cn4c
819デフォルトの名無しさん:2011/07/03(日) 12:47:08.80
喧嘩しないでC++の話すっべ

最近のCPUがL2/L3キャッシュをどんどん大きくしているのは
大きいコードが増えて来てキャッシュミスが増えないように考慮してるんだろうね
それと肝心のコア部分がどんどんシュリンクされて小さくなっていくので余ったスペースを
有効活用するという意味もあるだろう

C++0xにもついにthreadが入ったし、マルチコアが言語でサポートされるのはいいな
Goはスレッドを初めからサポートしてるしC#もPLINQでサポートしてるけど

ありゃCPUの話になってしもたすまん
820デフォルトの名無しさん:2011/07/03(日) 13:00:16.13
そう言うひとりごとはトイレの個室で存分につぶやいてください。ここはそういう場所じゃないんで
821デフォルトの名無しさん:2011/07/03(日) 13:34:15.25
>>820
いやだからね、C全盛の時代は良かったけど、C++みたいにコードが肥大化すると
ハードウェアもそれに合わせて変えて行かなければならないなあって話

独り言ではなく現実に起きてる事だから
822デフォルトの名無しさん:2011/07/03(日) 13:51:31.16
ああC++0x…早く使いたいな
もう少しコンスタントに規格拡張してほしいな
次の規格が10年後とか長すぎないか
823デフォルトの名無しさん:2011/07/03(日) 13:56:27.80
>>821
スレチだってのうんカス野郎
824デフォルトの名無しさん:2011/07/03(日) 13:58:22.43
>>823
人の書いてる事にいちいちケチつけんな
嫌だったらこのスレ開くなカス
825デフォルトの名無しさん:2011/07/03(日) 14:05:04.11
C++は機能が少なすぎる
826デフォルトの名無しさん:2011/07/03(日) 14:11:23.73
>>824
臭い
827811 ◆QZaw55cn4c :2011/07/04(月) 04:50:39.35
>>814
評価版(https://downloads.embarcadero.com/free/c_builder)をインストールしました。これに付属する bcc32 のバージョンは 6.31 でした。
これを使用して、以下のソースについて、codeguard のチェック能力を調べました。
http://codepad.org/kq7NFnkJ
(1)グローバルなnew/deleteをオーバーロードする。
(2)適切でないdelete(new[] したものを delete [] せず、delete する)。
(3)仮想デストラクタを定義していない。
以上は133行目〜135行目に #define で記述しています。

それぞれの .cgl ファイルは以下のとおりでした。
アドバイスをいただいた上で到達した最終形 http://codepad.org/oOn0xNo5 問題ありません。
(1) http://codepad.org/3GQQotKu グローバルな new/delete のオーバーロードでは、codeguard は誤動作しました。
(2) http://codepad.org/RlqV8ugy きちんと検出しており、検出内容を示すコメントも適切でした。
(3) http://codepad.org/ZcKLtP1e きちんと検出しており、検出内容を示すコメントも適切でした。

>>814
>しかし今は問題がない
残念ながら上記のとおり問題はありますね。ただしグローバルに new / delete すると、gcc ではコンパイルすらできない※ので、別の意味で推奨されないこと、とも考えられ、codeguard が通らなくてもしかたがないかもしれません。
http://codepad.org/pVU3fnX4 declaration of 'void* operator new(size_t)' throws different exceptions
(これはどういう意味でしょうか?)

>>728
残念ながら再現できませんでした。codeguard の dll 内で例外が発生したのでは、こちらとしてもどうしようもない。

役立つツールを紹介していただきありがとうございました。
828デフォルトの名無しさん:2011/07/04(月) 11:16:42.50
>>827
ここで書かずにEmbarcaderoのQCに報告しろカス
それからRAD Studio XEはアクチベーションを導入しているので、
割れ厨は使えないわけですなヒッヒッヒ
829デフォルトの名無しさん:2011/07/04(月) 11:22:20.19
>>827
> ※http://codepad.org/pVU3fnX4 declaration of 'void* operator new(size_t)' throws different exceptions
> (これはどういう意味でしょうか?)

メッセージどおりなんだけど・・・

"defferent" ってのは、置き換え元の ::operator new(size_t) に対してってこと。
830デフォルトの名無しさん:2011/07/04(月) 16:30:31.92
template<typename T> struct HOGE{
T val;
template<typename S> operator S(){
__if_exists(T::operator S){ return val.operator S(); }
__if_not_exists(T::operator S){ return S(val); }
}
};
Tがoperator Sを持っていて、SがS(T)コンストラクタを持っている場合、
通常、TをSにキャストするとS(T)コンストラクタが呼ばれてしまうと思うのですが、
これを上記のように定義してoperator Sを持っている場合は、
それを優先的に呼ぶようにしたいのですが、
__if_exists(T::operator S)がerror C2760となってしまいます。
変換演算子は__if_existsでは使えないのでしょうか。
831デフォルトの名無しさん:2011/07/04(月) 18:54:29.72
それってVCの機能?
VCスレの方が詳しい人多いと思う
http://hibari.2ch.net/test/read.cgi/tech/1308470068/
832デフォルトの名無しさん:2011/07/05(火) 03:07:00.03
>>819
>最近のCPUがL2/L3キャッシュをどんどん大きくしているのは
ということは inline は不利?

>C++0xにもついにthreadが入ったし、
posix-thread をいろいろ試していますが、自己流でかけば、すっぽ抜けが発生しそうで、しかもそのすっぽ抜けは再現性が低く発見が困難でたちが悪い。教科書に載っている書き方以外はしないようにしています。
そこらへん(つまりパターン化されている部分を自然に書けるように)、C++0x には反映されているのでしょうか?
つまりしろーとが安全にスレッドを扱えるようになっているのでしょうか?
833デフォルトの名無しさん:2011/07/05(火) 07:15:28.89
setとmapってメモリー管理どうなってんの?
例えばeraseしてもvectorみたいにメモリー解放されなかったりすんの?
あと、枝ごとにメモリー確保すんの?それっとも木全体でメモリー確保すンの?
(企画にはないだろうから多数派の実装を教えて)
834デフォルトの名無しさん:2011/07/05(火) 07:30:15.42
実装によるとしか
835デフォルトの名無しさん:2011/07/05(火) 07:34:03.93
>>833
実装依存だがSTLの要件から普通は二分木でじっそうされているらしい
836デフォルトの名無しさん:2011/07/05(火) 07:50:55.89
VCは赤黒木だった
837デフォルトの名無しさん:2011/07/05(火) 10:01:49.01
>>834 これが駄目な答えの典型
>>835 こっちの方が出来る奴
838デフォルトの名無しさん:2011/07/05(火) 10:31:04.18
>>837
おまえダメなやつだな。
839デフォルトの名無しさん:2011/07/05(火) 11:48:08.94
>>833
少なくともgccとVCでは、
- eraseでメモリ解放する
- メモリ確保はノードごとに確保

となってる
んで メモリ確保 とか メモリ解放 とか書いたけどこれらはアロケータに確保解放を要求するだけで、実際にメモリ確保解放するかはアロケータ次第
840デフォルトの名無しさん:2011/07/05(火) 23:22:34.27
なるほどみんなありがと。
てか移動しないのは規格なのかな。
JISのPDFでも見れば載ってんだろうけど。
841デフォルトの名無しさん:2011/07/06(水) 05:03:41.47
便乗ですまみせぬ。

erase()って管理してるオブジェクトを開放するだけで、
コンテナが確保したメモリ自体は開放されないんでしたっけ?
swap()使え云々って記憶してるのですが。
842デフォルトの名無しさん:2011/07/06(水) 05:59:11.99
template <char * pN>
class Property
{
 ...
};

テンプレート引数に Property<"hoge"> みたいに文字列へのポインタを渡したいんだけど、いい方法ある?
どうしてもコンパイル時定数関係のエラーが出てしまうんだが・・・

用は文字列(リテラル)をテンプレート引数に渡したいんだけど、やっぱり無理かな

class Foo
{
private:
 Property<"hoge"> hoge; // エラー
};
843デフォルトの名無しさん:2011/07/06(水) 06:01:15.63
>>842
無理。boost::mpl::stringをお勧めする。
844デフォルトの名無しさん:2011/07/06(水) 06:04:30.33
>>841
vectorはそうだよ
845デフォルトの名無しさん:2011/07/06(水) 06:40:08.07
>>842

extern char const * const p = "hello" ;

template <char const * const & p> class T { } ;

int main(void)
{
T<p> o ; return 0 ;
}
846デフォルトの名無しさん:2011/07/06(水) 07:09:44.52
>>844
dクス。vectorでしたか。
847デフォルトの名無しさん:2011/07/06(水) 09:15:32.99
>>843
なるほど。とりあえずmplに手を出してみるか
手持ちの1.45だとboost/mpl/string.hppが存在しないから、バージョンアップが必要っぽいな

>>845
おー、コンパイル通ったし
しかしここまで複雑になるならmpl使った方が良さそうかな・・・

何にせよちょっと試してみるよ。ありがとう
848デフォルトの名無しさん:2011/07/07(木) 00:21:40.93
・・・で、mplを使ってみたんだけど、wstringには対応していないっぽい?
こんなテンプレートの実体毎にwstringを保持できるようにしてみたんだが、評価してくれると嬉しいな

template <typename S> class PrenamedNode {
public:
 PrenamedNode() {}

 const std::wstring & GetName() const {
  return statics.name;
 }

private:
 class Statics {
 public:
  Statics() {
   const char * pInput = boost::mpl::c_str<S>::value;
   const size_t inputLength = strlen(pInput);
   const size_t outputLength = mbstowcs(NULL, pInput, INT_MAX);

   if (-1 == outputLength) {
    assert(false);
    abort();
   }

   this->name.resize(outputLength);
   mbstowcs(&this->name[0], pInput, outputLength);
  }

  std::wstring name;
 } static const statics;
};
849デフォルトの名無しさん:2011/07/07(木) 00:40:23.21
int main()
{
 PrenamedNode<boost::mpl::string<
  'The ', 'quic',
  'k br', 'own ',
  'fox ', 'jump',
  's ov', 'er t'
 >> hoge;

 PrenamedNode<boost::mpl::string<
  '―ソ', 'Ы\',
  '噂浬', '欺圭',
  '構蚕', '十申',
  '曾箪', '貼能'
 >> piyo;

 wprintf(hoge.GetName().c_str()); wprintf(L"\n");
 wprintf(piyo.GetName().c_str()); wprintf(L"\n");

 return 0;
};

codepadを使うべきだったと思うが、何も問題はない
850デフォルトの名無しさん:2011/07/07(木) 09:19:44.22
例外を投げるときクラスを作ってクラスに文字列を入れて投げるじゃないですか?
そんなことしなくても文字列を投げれば良いと思うのですが
文字列をクラスにいれて重くする利点を教えてください。
851デフォルトの名無しさん:2011/07/07(木) 09:26:28.39
>>850
try内で文字列判定の処理でも入れる気か?w
852デフォルトの名無しさん:2011/07/07(木) 09:26:41.74
>>850 エラーの分類を型に対応させて伝えられる。
853デフォルトの名無しさん:2011/07/07(木) 14:09:23.23
try
{
}
catch(T1 foo)
{
}
catch(T2 foo)
{
}
catch(T3 foo)
{
}

try
{
}
catch(string foo)
{
 if(foo.compare("hoge") == 0)
 {
 }
 else if(foo.compare("huge") == 0)
 {
 }
 else if(foo.compare("huga")== 0)
 {
 }
}
見るからにアホだろ
意味もなく重くする必要はないが例外処理に速さなんか求める奴がいたら設計から見なおせ
854デフォルトの名無しさん:2011/07/07(木) 14:15:23.97
まさかだが、例外が「エラーが起こった時に文字列を投げて表示するため」だけに存在すると思ってないか?
855デフォルトの名無しさん:2011/07/07(木) 14:19:03.09
文字列や整数でエラーコード伝えればハンドラを関数化できていいと思う
typedef std::string my_error;
try { ... } catch(my_error & e) { handle_my_error(e); } catch(...) { ... }
handle_my_error(my_error & e) { if(e == "hoge") { ... } else if(e == "fuga") { ... } }
856855:2011/07/07(木) 14:51:28.93
と思ったけどよく考えるとそんな事しなくても関数化できるのね
そうなると値より型で調べるほうがいいのかな

857デフォルトの名無しさん:2011/07/07(木) 17:47:01.23
class my_error
{
 virtual void process_error() { ... }
};

class Hoge : public MyError {};
class Piyo : public MyError {};
class Fuga : public MyError {};

...
catch (MyError & e)
{
 e.process_error();
}
858デフォルトの名無しさん:2011/07/07(木) 19:20:19.21
>>856
throwとcatchの間で文字列や整数の中身のフォーマットをあれこれすりあわせるより
catchはとりあえず抽象型だけ知っとけばおkみたいなほうが気が楽
859デフォルトの名無しさん:2011/07/07(木) 23:05:50.21
void handle(void) {
try { throw ; }
catch(ex1 & e) { std::cout << e.what() << std::endl ; }
catch(ex2 & e) { std::cout << e.what() << std::endl ; }
catch(...) { throw ; }
};

int main(void) {
try { throw ex1() ; } catch(...) { handle() ; }
try { throw ex2() ; } catch(...) { handle() ; }
}

これがベスト
860デフォルトの名無しさん:2011/07/09(土) 03:54:45.98
例外処理をエラー処理以外に使うと凄く悪いことをしている気分になる
でもこの便利さ・・・抜け出せない
861デフォルトの名無しさん:2011/07/09(土) 10:13:48.17
例えば?
862デフォルトの名無しさん:2011/07/09(土) 10:24:52.46
大域脱出
863デフォルトの名無しさん:2011/07/09(土) 10:34:51.17
くだらないね
864デフォルトの名無しさん:2011/07/09(土) 14:04:45.21
goto使った方がマシだ…
大域脱出を目的として例外処理使うとかgotoという文字面見たくないだけの
超筋悪でしょ…
意図と機能の目的が違っちゃってるよ
865デフォルトの名無しさん:2011/07/09(土) 14:28:55.45
gotoで関数の外に飛べるの?
866デフォルトの名無しさん:2011/07/09(土) 15:34:22.11
飛べるよ!
867デフォルトの名無しさん:2011/07/09(土) 15:37:33.97
gotoなら空も飛べるはず
868デフォルトの名無しさん:2011/07/09(土) 19:26:26.08
>>865
まじめに回答するとできない。多分 setjump/longjump をつかうんじゃないかな?わたしはつかったことないからわからない。
869デフォルトの名無しさん:2011/07/10(日) 01:31:59.63
>>860
一応言うけど、C++のtry-catch構文はコンパイラ(具体的にはgcc)によっちゃ
mallocとかsetjumpとか呼びだすからな。しかも(スレッドとは別の)コンテキスト情報まで保存する。
例外処理以外の用途で使うなとは言わんけど、その辺は忘れないようにしたほうがいい。
870デフォルトの名無しさん:2011/07/10(日) 01:52:40.43
staticメンバー変数の用途って具体的に何?

MessageRecord record;
MessageSource source( istream ); //メッセージテーブル作成
record.load( &source ); // static変数にメッセージテーブル登録

Message message( MesssageRecord(), "message1" ); //メッセージ取り出し"xxxx%d xxxx%s"をmessageが持つ。
message << value << file; //メッセージに値登録 
message.flush();. //メッセージ出力

こういう使い方と、メモリープールを作る用途しか思いつかん。
基本的に使ったことがない。
871デフォルトの名無しさん:2011/07/10(日) 02:10:26.60
モノステートとか
872デフォルトの名無しさん:2011/07/10(日) 02:13:01.19
ある程度コンパイラとの仕様を維持してこういうコードを安全にする事はできないだろうか。

class VirtualClass
{
        static void *virtual_table[16];
        void **vtable;
public:
        VirtualClass():vtable(virtual_table){}
};
void *XPortMethod(void *arg,...)
{
       ネットワーク先のオブジェクトへ転送処理
}
void *VirtualClass::virtual_table[16] =
{
       XPortMethod,
       XPortMethod,
       XPortMethod
};
VirtualClass instance;
LocalClass *stab = reinterpret_cast<LocalClass*>(&instance);
873デフォルトの名無しさん:2011/07/10(日) 17:13:42.35
こういうコードを書かなければいい
874デフォルトの名無しさん:2011/07/10(日) 19:57:16.44
昔はいろいろC++に不満があったのだが
今ではもう何が不満だったのか思い出せない
875デフォルトの名無しさん:2011/07/10(日) 21:18:50.32
>>874
どうしたんだ?もう燃え尽きてしまったのか?
876デフォルトの名無しさん:2011/07/11(月) 07:10:24.10
足るを知ってからがc++の始まり
877デフォルトの名無しさん:2011/07/11(月) 13:20:41.68
以下の関数fと、
void f(const A &obj){ ... }
副作用完了点まで生きているclass Aの一時オブジェクトを組み合わせた
f(A());
で、f内において
const_cast<A&>(obj)
をしてobjの内容を変更しても問題ありませんか?
878デフォルトの名無しさん:2011/07/11(月) 13:45:43.59
>>877
参照先の内容を変更するなら const A& ではなくて
A& と宣言したほうがいいと思う
const A& だと普通、参照先は変更されないと思うので
void f( A& obj ) { obj = ...; }
879デフォルトの名無しさん:2011/07/11(月) 13:48:58.34
>>878
そんな話じゃないだろ
一時オブジェクトのA&を提案とかアホか

ちなみに>>877の質問の答えは分からん
880デフォルトの名無しさん:2011/07/11(月) 13:51:11.60
>>877
f()が束縛しているのがA()の一時オブジェクトだからこの場合は問題がないが、
問題は他の所にある

いやちょっと待て、一時オブジェクトでも、値を変えない事を前提に書かれている
のだから、objの内容を変更したら一時オブジェクトが解体される時、つまりAの
デストラクタが走る時に問題が出るかも知れない
しかしAがconstとは限らなく、Aが非constの時も正しく解体されるようにデスト
ラクタは書かれているはずだからたまたま問題はないか・・・

f()が受け取るのは一時オブジェクトとは限らないというのが最大の問題で、const
を受け取るから安心だと思って呼び出したらなんと中身が書き換えられていた、
という事が起きかねず、バグの温床になるのでこういう書き方は勧められない

基本的にconst_castは必要ないはずで、これを必要とする時はロジックに誤り
があるのが普通で、全体をよく見直す事をおすすめする
881デフォルトの名無しさん:2011/07/11(月) 14:00:45.38
一時オブジェクトが A& で束縛できないのが問題なら
適当に名前を付けたらいいんじゃないの
f( A& obj ) { ... };

A a;
f(a);
882デフォルトの名無しさん:2011/07/11(月) 14:04:04.70
A&&をつかえよ
883デフォルトの名無しさん:2011/07/11(月) 14:12:15.12
グッバイC++98
C++0xはやくきてくれ
884デフォルトの名無しさん:2011/07/11(月) 14:18:47.82
ラムダの記法みるだけで吐き気がするんだけど。C++0x来るって事はそれも来るんだろ。
885 忍法帖【Lv=23,xxxPT】 :2011/07/11(月) 14:25:45.26
吐き気がするなら使わなくていいのよ。
886デフォルトの名無しさん:2011/07/11(月) 14:49:40.93
嫌なものを自分から見るバカなんでしょう
887デフォルトの名無しさん:2011/07/11(月) 15:14:46.19
記法はこんなもんかーで流すのが胃にやさしい
888デフォルトの名無しさん:2011/07/11(月) 15:48:33.65
文字列の配列の領域を確保するようにヘッダファイルに書きたいのですが、
LPTSTR p[] = TCHAR[200][100];

f:\ctest\test.h(19) : error C2275: 'TCHAR' : この型は演算子として使用できません
c:\program files\microsoft visual studio 9.0\vc\include\tchar.h(203) : 'TCHAR' の宣言を確認してください。
とエラーが出ます。どう書くべきでしょうか?
889デフォルトの名無しさん:2011/07/11(月) 15:57:02.37
なんだそのふざけた文法
ポインタとnewにすればいいんじゃねーかな
890デフォルトの名無しさん:2011/07/11(月) 16:00:20.65
ヘッダで宣言するだけなら TCHAR p[200][100];
C++の前にC言語をだな
891デフォルトの名無しさん:2011/07/11(月) 16:12:54.04
>>888
c/cppに
TCHAR p[200][100];

hに
#pragma once
extern TCHAR p[200][100];
892デフォルトの名無しさん:2011/07/11(月) 16:28:48.98
hの方の200はいるのか?
893888:2011/07/11(月) 16:59:16.52
TCHAR p[200][100];
で書きます。ありがとうございます。
894デフォルトの名無しさん:2011/07/11(月) 17:15:12.62
>>892
sizeof(p)が出来る
895デフォルトの名無しさん:2011/07/11(月) 17:38:05.63
>>892
VCで200省略したらエラーになった。
896デフォルトの名無しさん:2011/07/11(月) 17:39:44.56
>>895
なるわけないだろう・・・・・
念のため確かめたが動くし
897デフォルトの名無しさん:2011/07/11(月) 17:59:02.28
>>877
constで定義した変数をconst_castして変更するのは未定義
非constをconst&にキャストしたのをまた非constにキャストするのは合法
898デフォルトの名無しさん:2011/07/11(月) 18:05:59.63
>>897
なんで質問の趣旨が理解出来ない奴がこんなに多いんだwwwww
具体例まであるのにw
899デフォルトの名無しさん:2011/07/11(月) 18:08:33.05
>>898
2行目まで読んだ?ちゃんと答えてるんだけど
まあ朝鮮人に日本語2行はちょっと難しかったかな
900デフォルトの名無しさん:2011/07/12(火) 10:31:25.29
結局、上の例は

const A obj;
const_cast<A&>(obj)

ではなく

const A& r = A();
const_cast<A&>(r)

と同じ事で
非constの一時オブジェクトをconst参照で受けて
それを元の非constにcastしてるだけだから大丈夫
ということかな。
901デフォルトの名無しさん:2011/07/12(火) 19:06:58.28
・virtualコンストラクタってどんな使い方があるんでしょうか。
・C#のインターフェイスのようなクラスを作る場合、純粋仮想デストラクタは
 出来ないようなので実装を持たせることになりますが〜.hと〜.cppのどちら
 に書くべきでしょうか。
 
902デフォルトの名無しさん:2011/07/12(火) 19:22:31.23
903デフォルトの名無しさん:2011/07/12(火) 21:53:10.29
静的メンバ関数をthisポインタ経由で呼び出してもいいんですか?
904デフォルトの名無しさん:2011/07/12(火) 21:57:50.93
>>903
thisポインタ経由ってどういう意味?
905デフォルトの名無しさん:2011/07/12(火) 22:06:06.94
this->func();
ということです
906デフォルトの名無しさん:2011/07/12(火) 22:16:30.66
そうです
907デフォルトの名無しさん:2011/07/12(火) 22:17:02.20
>>905
static なんだから
func();
でいいんじゃないか?
908デフォルトの名無しさん:2011/07/12(火) 22:20:09.46
そんなことは質問してません
909907:2011/07/12(火) 22:25:47.49
そいつは時間取らせて悪かったな
910デフォルトの名無しさん:2011/07/12(火) 22:32:25.48
>>903
可能です。
911デフォルトの名無しさん:2011/07/13(水) 11:28:34.55
class Hoge {
 void Print() {
  PrintCore(); // ぱっと見どこで定義されている関数か分からない
  this->PrintCore(); // インスタンス関数の呼び出しに見える
  Hoge::PrintCore(); // クラス名を間違える可能性
 }

 static void PrintCore();
};

俺の場合はHogeクラス内で typedef Hoge this_class を宣言して、this_class::PrintCore() と呼び出している。
912デフォルトの名無しさん:2011/07/13(水) 11:31:14.37
フーンデッティウ
913デフォルトの名無しさん:2011/07/13(水) 11:38:54.17
>> ぱっと見どこで定義されている関数か分からない

フリー関数ならnamespace::で判るし、
別のクラスのメソッドなら前に obj. とか付くし、
static でないメソッドの中からしたら、staticかどうかなて関係ないし。
普通にPrintCore()でいいんでないのん?
914デフォルトの名無しさん:2011/07/13(水) 12:03:06.87
ちなみにメンバ変数を使うときは this-> を省略しない
メンバ変数名には m_hoge や _hoge のようなプレフィックスを使わない hoge で十分

class Hoge {
private:
 typedef Hoge this_class;

 int value;
 static int hogeValue;
};

メンバ変数 value へのアクセスは this->value を使用し
静的メンバ変数 hogeValue へのアクセスは this_class::hogeValue を使用する

という俺の宗教ですが何か
915デフォルトの名無しさん:2011/07/13(水) 12:03:58.12
placement newは引数が2つあるのに
使うときは一つなのはなぜですか?
916デフォルトの名無しさん:2011/07/13(水) 12:16:56.03
newが中で頑張ってるから
917デフォルトの名無しさん:2011/07/13(水) 13:38:09.31
>>915
指定した型が必要とするサイズはコンパイラが知ってるんだし、
ユーザーが指定するとしたら間違える可能性もでてきちゃう。
918デフォルトの名無しさん:2011/07/13(水) 16:57:48.00
>>914
何のメリットも見つからない
919デフォルトの名無しさん:2011/07/13(水) 17:01:17.29
>>914
独り言はチラシの裏に書け
920デフォルトの名無しさん:2011/07/13(水) 17:20:48.31
>>918-919
やけに息が合った書き込みですね
921デフォルトの名無しさん:2011/07/13(水) 18:07:22.91
>>911
Pythonでもやってろよ
922デフォルトの名無しさん:2011/07/13(水) 18:44:18.77
あなたは this->hoge 派ですか?
それとも m_hoge 派ですか?

なにも修飾がない、ただの hoge は、確かに見たくないな

大域変数なのか、メンバ変数なのか、関数の仮引数なのか、
いちいち確かめるために時間が無駄になる

確かめる手間を省くことで、コードの可読性は上がり、読む人の負担は軽減されると思う

同じ理由から、修飾無しの foo() も可読性にやや劣ると思う
923デフォルトの名無しさん:2011/07/13(水) 18:47:23.01
そんな自演してまで擁護しなくても責めないから休んでいいよ
924デフォルトの名無しさん:2011/07/13(水) 18:53:50.12
googleスタイルとかいくつかの有名な参考書だとメンバ変数は
int hoge_;
としてた
925デフォルトの名無しさん:2011/07/13(水) 18:57:25.94
非公開な情報を隠蔽するために抽象クラスやらPImplなどあるけど
全部のクラスにこんなことしてたら大変だと思うんだけど
適切な運用法をばっさり教えてくれ
926デフォルトの名無しさん:2011/07/13(水) 19:07:19.66
一番お外のクラスだけちゃんと隠蔽すりゃいいんでない?
927デフォルトの名無しさん:2011/07/13(水) 20:13:37.20
関数だったら、クラスメンバということを明確にするために
this->func1();
もありだと思うけどな。

this->data=0;
とやればデータメンバだと分かるからという理由で装飾を止めてしまうと、
ローカルメンバと衝突する可能性がでてくる。

そしてたぶん、コンパイルエラーにならないよな・・?
だから辞めた方が良い。
928デフォルトの名無しさん:2011/07/13(水) 22:20:56.55
emacsやらeclipseやらvisual studioやらの入力補助を使うので、
thisを付けずにはいられない。
929デフォルトの名無しさん:2011/07/13(水) 22:22:21.47
void get(Struct *buf)
上みたくポインタ経由で情報を取得する系の関数の場合、一般的に必ずif (buf)するもんなの?
0ならどうせ正常に動かないんだから必要ないように感じるんだけど。もちろん場合によるけども
参照も考えたけど、const&以外はどうもしっくりこなくて
930デフォルトの名無しさん:2011/07/13(水) 22:42:49.03
仕様書にIf this pointer is NULL, the behavior is undefined.って書いておけばおk
931デフォルトの名無しさん:2011/07/13(水) 23:01:12.50
そうしときます
932デフォルトの名無しさん:2011/07/13(水) 23:26:04.32
assertでデーンさせる
933デフォルトの名無しさん:2011/07/13(水) 23:28:24.94
例外機構なんて無かったんや
934デフォルトの名無しさん:2011/07/13(水) 23:34:37.08
>>927
メンバにはm_を頭につけるだけで衝突も区別も解決するけどな
メンバを参照するときはthisとか書かずにコード保完で一発だし
935sage:2011/07/14(木) 00:35:44.83
http://codepad.org/jqAXsH1I

実行結果がテキストのものと違くなってしまいます
テキストの実行結果では
Base
Derived
こうなるんですけど書き写したものを実行すると上のリンク先の実行結果になってしまう
意味がわからないので教えてください
936デフォルトの名無しさん:2011/07/14(木) 00:53:22.76
>>935
俺もよくわからないんだが、こうしたらOKだった
http://codepad.org/3fFEuUbU
937デフォルトの名無しさん:2011/07/14(木) 01:03:58.13
>>935
仮想関数を持たないクラスに対する typeid は静的な型しか返さない。

5.2.8 [expr.typeid] p3
> When typeid is applied to an expression other than an lvalue of a polymorphic
> class type, the result refers to a type_info object representing the static type of
> the expression. ...
938デフォルトの名無しさん:2011/07/14(木) 10:08:06.99
template<typename T>struct STR{
template<typename S>void operator+(S);//A
template<size_t L>void operator+(const T(&)[L]){}//B
template<>void operator+(const T*){}//C
};
template<typename T,typename S>void operator+(S,const STR<T>&);//D
template<typename T,size_t L>void operator+(const T(&)[L],const STR<T>&){}//E
template<typename T>void operator+(const T*,const STR<T>&){}//F

const char a[]="a";
const char *b=a;
STR<char>c;
c+a;//B
c+b;//C
a+c;//Eを呼びたいがC2593
b+c;//F

ポインタか配列かを区別したいのですが、グローバル演算子の方はそもそも特殊化になっていないようです。
EとFをDの特殊化として、曖昧さを解決する方法はありませんか?
939デフォルトの名無しさん:2011/07/14(木) 10:11:16.34
>>937
横からだが、情報サンクス…。
まさかこのスレで勉強になることがあろうとはw
940938:2011/07/14(木) 11:21:31.48
すいません、関数の部分特殊化なんてありませんでした。
関数を部分特殊化のようにしたい場合は関数オブジェクトを使うようなのですが
operator+は関数オブジェクトにはできないので、
別の関数オブジェクトを作ってそれを呼ぶようにして自己解決しました。

template<typename T,typename S>struct SUB{
void operator()(S,const STR<T>&);//D
};
template<typename T>struct SUB<T,const T*>{
void operator()(const T*,const STR<T>&){}//E
};
template<typename T,size_t L>struct SUB<T,const T[L]>{
void operator()(const T(&)[L],const STR<T>&){}//F
};

template<typename T,typename S>void operator+(const S&s,const STR<T>&t){//(D)
SUB<T,S> sub;sub(s,t);
}
941デフォルトの名無しさん:2011/07/14(木) 12:02:40.57
C2593の原因は(&)を外せばいいと思うよ
あと、EとFみたいなのを作りたい場合は普通にオーバーロードさせればいい
BとCも同じ

template<std::size_t N> void operator+(const T[N]); // B
void operator+(const T *); // C
みたいな感じで
942938:2011/07/14(木) 13:37:25.44
(&)を外したらコンパイルできました。
しかしFが呼ばれてしまいました。

>普通にオーバーロード
Cのtemplate<>とAを消すとBが呼ばれました。

templateでない方が優先されるようなので、左辺にクラスが来る場合でも
グローバルテンプレートとして以下のようにしたところ、うまくいきました。

template<typename T>void operator+(const STR<T>&,const T*){}//C

Dに関係なくEとFはオーバーロードされているらしく、Dを消しても変わりませんでした。

(&)は消せないので逆にFをconst T*const&にするとうまくいきました。

やはり、&を外すか両方につけるかがC2593の解決方法のようですね。

Cに&が必要がないのはBがクラス内部だからか…?


これで余計な型へのオーバーロードを宣言することなくいけそうです。
ありがとうございました。
943938:2011/07/14(木) 14:39:36.16
struct ...{...
template<size_t L>void operator+=(const T(&)[L]){}//B2
};

//template<typename T> void operator+=(const STR<T> &,const T*){}//C2
//template<typename T> void operator+=(STR<T> &,const T*){}//C3
template<typename T> void operator+=(STR<T> &,const T*const &){}//C4

+=を定義しようと、operator+と同じ型のB2とC2を追加し、コンパイルできました。
しかし、実際には+=は値を変更するのでC3のように左辺のSTR<T>からconstを取った所
C2593になってしまいました。

結局C4のように、また右辺をconst T*const &とすることで、回避しました。


以上、日記ばかりですいません。
944デフォルトの名無しさん:2011/07/14(木) 20:34:42.16
std::cerrはバッファリングされず、std::clogはバッファリングされるとのことですが

std::clog << "1";
std::cerr << "2";
std::clog << "3";

とした場合、1がバッファリングされている間に2が先に出力され、"213"となる場合があるのでしょうか?
945デフォルトの名無しさん:2011/07/14(木) 22:32:25.88
知恵袋でメイヤーさんやBjarne Stroustrupをディスってるんだけど、
どう思う?

つーかBjarne Stroustrupを捕まえて、C++をよくしらないとか
呆れるんだけど


>「Effective C++」 は駄作でしょうか?
ttp://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1263432432
946デフォルトの名無しさん:2011/07/14(木) 22:33:27.28
釣られんなよ
947デフォルトの名無しさん:2011/07/14(木) 23:37:05.43
名前解決について教えて下さい。

以下のコードは、どうしてコンパイルエラーになんですか?
ttp://ideone.com/VoAl5

dp の動的な型は E なので、
仮想関数をオーバーライドしている E::f(X) が呼ばれると思ったのですが、

名前の隠蔽が何か悪さをしているのでしょうか?
948デフォルトの名無しさん:2011/07/14(木) 23:42:22.42
D::f によって隠された B::f は隠されてしまったので見えなくなります
dp->B::f などと明示的に指定するか D 内で using B::f して見えるようにしてやってください
949デフォルトの名無しさん:2011/07/15(金) 18:40:05.87
なぜthisは参照ではいけなかったのか
950デフォルトの名無しさん:2011/07/15(金) 18:41:17.71
D&Eより、「thisが作られた時代に参照がなかったから。」
951デフォルトの名無しさん:2011/07/15(金) 18:45:56.71
self参照とかキーワードにしちゃえばいいのに
#define self (*this)
ってやるよねみんな
952デフォルトの名無しさん:2011/07/15(金) 18:47:28.65
無駄に可読性落とすだけじゃないか?それは
953デフォルトの名無しさん:2011/07/15(金) 18:49:24.99
マクロは禁止
954デフォルトの名無しさん:2011/07/15(金) 19:13:06.49
Hoge &self(){return *this;}
const Hoge &self() const {return *this;}
とか
955デフォルトの名無しさん:2011/07/15(金) 19:17:23.79
それはちょっと・・・
956デフォルトの名無しさん:2011/07/15(金) 19:26:53.99
class Hoge{
private:Hoge &This;
public:Hoge(): This( *this ){ This.func(); }
void func();
};
957デフォルトの名無しさん:2011/07/15(金) 19:41:13.43
それじゃsize増えるし
958デフォルトの名無しさん:2011/07/15(金) 19:42:09.00
class E {
public:
  int t, e;
  E(int a, int b) {
    t = a;
    e = b;
  }
  bool operator<(const E &r) {
    return (t == r.t ? e < r.e : t < r.t);
  }
};

int main(){
  multiset<E> ms;
  ms.insert(E(800, 1));
}

setの型を自作クラスにしたくて上のようにしたのですが,下記のエラーが出てコンパイル通りません.何が原因でしょうか.

stl_function.h: In member function ‘bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = E]’:
stl_tree.h:1168: instantiated from ‘typename std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_equal(const _Val&)
[with _Key = E, _Val = E, _KeyOfValue = std::_Identity, _Compare = std::less, _Alloc = std::allocator]’
stl_multiset.h:370: instantiated from ‘typename std::_Rb_tree<_Key, _Key, std::_Identity<_Key>, _Compare, typename _Alloc::rebind<_Key>::other>::const_iterator std::multiset<_Key, _Compare, _Alloc>::insert(const _Key&)
[with _Key = E, _Compare = std::less, _Alloc = std::allocator]’
code.cpp:28: instantiated from here
stl_function.h:230: error: passing ‘const E’ as ‘this’ argument of ‘bool E::operator<(const E&)’ discards qualifiers
959デフォルトの名無しさん:2011/07/15(金) 19:44:23.21
operator < (hoge const &) const
960デフォルトの名無しさん:2011/07/15(金) 21:29:57.32
可変引数の ... の左のカンマがいらないのはなぜ?

そのようにした意図を禿が言っているのを読んでみたいんですが、
禿本の何ページとか禿Webのどことか誰か知りませんか?
そう決めた人が禿でなければ禿以外の人でも他の禿でもいいです。
961デフォルトの名無しさん:2011/07/15(金) 21:35:34.82
>>959
ありがとう.でも自分では理解できてない・・
962デフォルトの名無しさん:2011/07/15(金) 21:52:50.70
>>961
・setに入れるときはデータがconstの状態で入れられる。
 (そうしないと木が崩れるから)
・constの状態で呼べるのはconstメンバ関数だけ。
つまり比較演算子が呼べなくてコンパイルエラー
963デフォルトの名無しさん:2011/07/15(金) 22:52:05.69
>>962
>・constの状態で呼べるのはconstメンバ関数だけ。
なるほど,なんとなくわかりました.ありがとう.
964デフォルトの名無しさん:2011/07/16(土) 12:23:52.18
template<class X> class Vector
{
X data_[3];
public:
template <typename Y, typename Z>
friend Vector<X> operator+( const Vector<Z>& x, const Vector<Y>& y){
Vector<X> z;
for(int i = 0; i < 3; ++i) z.data_[i] = x.data_[i] + y.data_[i];
return z;
}
};
int main(){
Vector<double> x,y;
Vector<float> z;
Vector<long double> a = x + z + y;
}
のように精度が異なるVectorの足し算を行うクラスを作りたいのですがうまくいきません。
どのようにすればいいでしょうか?
965デフォルトの名無しさん:2011/07/16(土) 13:20:26.95
>>964
ほとんどでてるであろうエラーの説明になるけど
operator+でテンプレート引数の違うVectorを呼んだ場合
返り値のVector<X>をどっちにの型にしたらいいのか曖昧になってる
966デフォルトの名無しさん:2011/07/16(土) 17:27:43.23
std::shared_ptr について質問です。
参照カウンタを用いて管理しているそうですが、
get() メソッドで取得したポインタを使いまわした場合、
それらは管理対象外という認識でよろしいのでしょうか?
967デフォルトの名無しさん:2011/07/16(土) 17:31:26.27
>>966
そうだよ。
getしたポインタ使いまわしていても、shared_ptrの参照カウントが0になると削除されるよ。
そして、shard_ptrから所有権を剥奪するメンバ関数もない。
968デフォルトの名無しさん:2011/07/16(土) 17:34:26.10
>>967
即レスありがとうございます。
気をつけないとダメなんですね。
969デフォルトの名無しさん:2011/07/16(土) 17:42:27.01
関数の引数として渡すパフォーマンスが問題ならshared_ptrをconst参照で渡すことを検討するといいゾ

970デフォルトの名無しさん:2011/07/16(土) 17:55:49.13
>>969
つまりコピーさせないって事ですね。
ありがとうございます。
971デフォルトの名無しさん:2011/07/16(土) 18:37:24.91
>>964
割と手抜きだけど、よかったらどうぞ
ttp://codepad.org/U49icpW7
972デフォルトの名無しさん:2011/07/16(土) 18:54:23.28
>>969
そこのパフォーマンス気にするなら、
shared_ptrなんか渡さずポインタ渡しするか、または
スマポなんて使わないか、になるとおもうがなぁ。
無駄に引数が長くなるだけじゃね?const 参照なんてしたら
973964:2011/07/16(土) 19:21:35.31
>>965
レスありがとうございます。
float + double なら返り値は double、double + long doubleなら
返り値は long double 等、精度が高いほうを返すようにしたいのですけど、
自動的に実現する方法はなく、テンプレートの特殊化で、
全ての組み合わせを明示的に羅列するしかないのでしょうか?
974デフォルトの名無しさん:2011/07/16(土) 19:33:14.07
C++0xなら
// XとYの内サイズの大きい方に合わせる
template <typename X, typename Y>
Vector<typename std::conditional<sizeof(X) >= sizeof(Y), X, Y>::type>
operator+(const Vector<X> &lhs, const Vector<Y> &rhs)
{
return Vector<typename std::conditional<sizeof(X) >= sizeof(Y), X, Y>::type>(lhs) += rhs;
}

std::conditionalが使えないなら、boost::mpl::if_cを使うか、それ相当のものを自作する
975デフォルトの名無しさん:2011/07/16(土) 19:37:16.66
C++0xならdecltypeがつかえるんじゃないか?
template <typename Y, typename Z>
friend Vector<decltype((Y)0+(Z)0)> operator+( const Vector<Z>& x, const Vector<Y>& y){

976デフォルトの名無しさん:2011/07/16(土) 19:40:25.21
>>972
スマポの安全性もパフォーマンスも欲しいゾ
977964:2011/07/16(土) 19:41:32.14
どうもありがとうございます!
これを機にC++0xを始めてみようと思います。教えて頂いた
コードを理解できるよう勉強してみます。
978デフォルトの名無しさん:2011/07/16(土) 19:52:33.93
>>972
引数でconst参照のshared_ptrは普通に使うと思うぞ
979デフォルトの名無しさん:2011/07/16(土) 21:03:48.51
>>978
そうなのか例えば
void fuga::func(const boost::shared_ptr<const hoge>& arg)const;
とか一瞬嫌な感覚があって・・・
まあ状況にもよるとおもうが
980デフォルトの名無しさん:2011/07/16(土) 21:10:55.36
shared_ptrのスマポはカウンタの増減がアトミックオペレーションだからな
パフォーマンスがどうでもいいところ以外でshared_ptrを使うなんて恥さらし以外のなんでもないぞ
設計ちゃんとしてナマポかユニポ使うのが技術者として最低限の良心だろ
思考放棄してとりあえずshared_ptrでいいかとか言ってるうちは永遠にアマチュア
981デフォルトの名無しさん:2011/07/17(日) 00:08:38.09
今の時代、殆どの場所が
パフォーマンスがどうでもいいところじゃね?
982デフォルトの名無しさん:2011/07/17(日) 00:10:26.46
ぬるぽ
983デフォルトの名無しさん:2011/07/17(日) 00:38:23.48
ガッ
984デフォルトの名無しさん:2011/07/17(日) 01:17:47.24
まぁ業務用アプリ程度なら全部shared_ptrでいいな
いや、業務用アプリにC++なんぞ必要ない。C#で十分だ
985デフォルトの名無しさん:2011/07/17(日) 01:26:54.74
void SetHoge(const boost::shared_ptr<const Hoge> & pHoge) {}

・・・は長いので、Hogeクラスにtypedefを用意しておく

class Hoge
{
public:
 typedef boost::shared_ptr<Hoge> shared_ptr;
 typedef boost::shared_ptr<const Hoge> shared_ptr_const;
};

void SetHoge(const Hoge::shared_ptr & pHoge) {}
986デフォルトの名無しさん:2011/07/17(日) 01:30:26.87
>>985
2時間半近く考えた結論がそれか?
987デフォルトの名無しさん:2011/07/17(日) 08:17:12.53
>>975
どうせ 0x 使うなら declval か trailing return type 使おうぜ。
988デフォルトの名無しさん:2011/07/17(日) 10:08:07.82
BOOST_TYPEOF使ってみた
http://codepad.org/dLb34JI8
gccのtypeinfoは読みにくいな…
vcのは (int,float)->float
x+z+y -> class MyVec<double> と表示されるのだけど
989デフォルトの名無しさん:2011/07/17(日) 12:52:15.68
>>986
f○○k。ならどうやってomitするかteachしてくださいよメーン?
990デフォルトの名無しさん:2011/07/17(日) 12:55:46.44
どーう。こてー。
991デフォルトの名無しさん:2011/07/17(日) 13:10:26.32
クラスに含まれるメンバー関数集合でそれに含まれるメンバー関数に
ユーザーが呼び出す順番にルールがある場合は
どのようなデザインが望ましいですか?
992デフォルトの名無しさん:2011/07/17(日) 13:21:47.02
日本語をもう少し丁寧に書いてください
993デフォルトの名無しさん:2011/07/17(日) 13:24:42.40
C++によるメンバー関数の定義されたクラス全体に含まれるメンバー関数集合の属Aに含まれるメンバー関数集合に
クライアントが呼び出す半順序に制限がある状態Pでは
どのようなデザインが望ましいでしょうか?
994デフォルトの名無しさん:2011/07/17(日) 13:28:38.51
カプセル化すればよろしい
995デフォルトの名無しさん:2011/07/17(日) 13:38:17.34
こういうのはどうですか?
メンバー関数に番号をつける。
クライアントはクラスから使用可能メンバー関数の番号リストを借りることが出来る。
それを見てクライアントは次に使うメンバー関数を決める。
996デフォルトの名無しさん:2011/07/17(日) 13:58:21.47
普通に定義する。順番がまずい場合は例外出す。
997デフォルトの名無しさん:2011/07/17(日) 13:58:22.30
呼び出す順番に制限があるクラスは出来損ないです
どんな順番で呼び出してもいいように作り直しましょう
998デフォルトの名無しさん:2011/07/17(日) 14:14:58.02
そんなあなたにFacade パターン
999デフォルトの名無しさん:2011/07/17(日) 14:24:24.49
ume
1000デフォルトの名無しさん:2011/07/17(日) 14:25:56.02
Facade ってセミだっけ?
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。