[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 12/31 01:11 / Filesize : 246 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者歓迎】C/C++室 Ver.59【環境依存OK】



1 名前:デフォルトの名無しさん [2008/03/30(日) 01:50:26 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.50【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1204124447/
【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm



560 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 00:22:01 ]
VC++ 2008 EE でWindowsアプリケーションを作成したいのですが、
そのまま<windows.h>をインクルードしてもエラー表示なので、
どのような設定が必要なんですか?

561 名前:デフォルトの名無しさん [2008/04/10(木) 00:24:06 ]
>>548
なんのためのメンバ関数なんだか。

562 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 00:33:29 ]
>>561
いや、他人の書いたコードを解読してるんだ。。

563 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 00:39:03 ]
>>560
[ファイル]-[追加]-[新しいプロジェクト]
[Visual C++]-[Win32]-[Win32プロジェクト]-[プロジェクト名]-[OK]
[次へ]-[Windowsアプリケーション]-[■空のプロジェクト]-[完了]
[ソースファイル]-[追加]-[新しい項目]
[Visual C++]-[コード]-[C++ファイル]-[ファイル名]-[追加]

564 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 01:46:59 ]
>>563
ありがとうございます。3行目まではうまく設定できたのですが、
4行目の「ソースファイル」?が何を指しているのかわからず、
そのまま5行目の作成を行いました。
結果はやはりビルドエラーです。
コードは以下です。

LRESULT CALLBACK WindowProc(HWND,UINT,WPARAM,LPARAM);

/* アプリケーションエントリーポイント */
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR CmdLine,
int CmdShow)
{
   //処理

return ;

}

/* ウインドウプロシージャ */
LRESULT CALLBACK WindowProc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)
{
//処理
}
return DefWindowProc(hwnd,message,wparam,lparam);
}

565 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 01:50:01 ]
エラーの内容は?

566 名前:デフォルトの名無しさん [2008/04/10(木) 01:54:31 ]
ファーストへの悪送球。

567 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 01:54:45 ]
1>------ ビルド開始: プロジェクト: C800, 構成: Debug Win32 ------
1>コンパイルしています...
1>MJ_1.cpp
1>.\MJ_1.cpp(26) : error C2440: '=' : 'const char [6]' から 'LPCWSTR' に変換できません。
1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
1>.\MJ_1.cpp(41) : error C2664: 'CreateWindowExW' : 2 番目の引数を 'const char [6]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照)
1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
1>C800.cpp
1>.\C800.cpp(28) : error C2440: '=' : 'const char [6]' から 'LPCWSTR' に変換できません。
1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
1>.\C800.cpp(43) : error C2664: 'CreateWindowExW' : 2 番目の引数を 'const char [6]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照)
1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
1>コードを生成中...
1>ビルドログは "file://d:\My Documents\Visual Studio 2008\Projects\C800\C800\Debug\BuildLog.htm" に保存されました。
1>C800 - エラー 4、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

です。

568 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 02:02:15 ]
>>567
なぜコンパイルエラーの部分を省略する。
ググればいろいろ見つかる。
www.google.co.jp/hws/search?hl=ja&q=LPCWSTR+char+c2440&client=fenrir&adsafe=off&safe=off&lr=lang_ja



569 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 02:21:14 ]
>>568
ありがとうございます。
文字変換だったのですね。
しかしググっても出てこないので最後に嘆きます。

1>------ ビルド開始: プロジェクト: GAME, 構成: Debug Win32 ------
1>マニフェストを埋め込んでいます...
1>.\Debug\GAME.exe.intermediate.manifest : general error c1010070: Failed to load and parse the manifest. U_U!$kLdK
1>~[
1>ビルドログは "file://d:\My Documents\Visual Studio 2008\Projects\C800\GAME\Debug\BuildLog.htm" に保存されました。
1>GAME - エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

なるエラーが出るのですが、まったく意味不明です。

570 名前:569 mailto:sage [2008/04/10(木) 18:46:06 ]
申し訳ないです。
自己解決しました。
ありがとうございます。

571 名前:デフォルトの名無しさん [2008/04/10(木) 21:45:49 ]
VC++2005で、ADOでSQLSERVER2005に接続して、binary型のフィールドに
1000byte程のバイナリデータを保存したいのですが、
long型の配列にデータをmemcpyし、それをrs->Updateしようとすると、
コンパイルで「bool値に変換します」というような警告がでて、データを転送できません。
バイナリデータを転送するにはどのようにすればいいのでしょうか?
(配列には正常にデータがコピーされていることはファイル出力で確認できております)


572 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 00:26:01 ]
>>571
support.microsoft.com/kb/258038/ja

573 名前:デフォルトの名無しさん [2008/04/11(金) 06:15:26 ]
vector〈基底クラス*〉に数種類の派生クラスをプッシュバックしてオーバーライドした関数を実行するようなことはできますか?

574 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 06:18:09 ]
>>573
virtualなメンバ関数を実行ということなら、可能です。

575 名前:デフォルトの名無しさん [2008/04/11(金) 06:33:22 ]
もちろん仮想関数にしてあります
&の付け忘れでした

解決できましたありがとうございます

576 名前:デフォルトの名無しさん [2008/04/11(金) 06:38:48 ]
>>573=>>574=>>575

577 名前:デフォルトの名無しさん [2008/04/11(金) 06:50:20 ]
573=574=575=576

578 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 07:17:15 ]
>>575
メモリリークに気をつけような。
boost::ptr_vector の使用も検討してみるといい。



579 名前:デフォルトの名無しさん [2008/04/11(金) 12:34:50 ]
動的に二次元配列を確保するにはどうすればよいですか?
int x=10; int y=10;
double a[x][y];
という風に書くのは、xyが小さい間は出来たのですが、newで確保しようとすると
yを変数にできません。vectorを使わずに上記のようなことができるでしょうか?
よろしくお願いします。


580 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 12:37:06 ]
double **a;

*a = new double[x]

for( int i = 0; i < x; ++i )
 a[x] = new double[y]

こんなん

581 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 12:47:33 ]
boost::multi_arrayオススメ。

582 名前:デフォルトの名無しさん [2008/04/11(金) 12:52:43 ]
>>580
ありがとうございます。
確保した二次元配列をほかの関数に渡すにはどうすればよいですか?

あと、boost::multi_arrayは速いですか?
今書いているのは、std::vectorもあまり知らない人に見せるためなので、
boostなんてとてもだめです。


583 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 12:57:05 ]
アセンブリ言語のコンパイラのCソースプログラムを持っているのですが、
アセンブリ言語をコンパイルするには、このソースをコンパイルしてから
どうすればいいのでしょうか?

584 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 12:58:11 ]
void func( int **a );
これでわたせるんじゃね、多分

585 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 13:06:03 ]
>>582
そういう初心者には、素直に一次元配列を仮想化して使う方がいい。
こんな関数でも用意すればアクセスするのも割と簡単だ。
static unsigned offset(unsigned x, unsigned y, unsigned w)
{
return x + y * w;
}
勿論、メモリ確保はこうなる。
double * a = new double[w * h];
あー、ついでに言えば>580はバグだらけだから要注意で。
つーか、>584もかすだわ。

586 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 13:06:38 ]
>>583
Cソースをコンパイルしてできた実行ファイルを実行してアセンブルすれ
ばいいのでは。



587 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 13:19:33 ]
>アセンブリ言語のコンパイラ
有り得ない間違いだな。

588 名前:デフォルトの名無しさん [2008/04/11(金) 13:29:33 ]
>>580
これは酷い。



589 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 13:34:19 ]
mbscmp
wcscmp
などの違いがわからない・・・・
あと、lstrcmp とか strcmp みたいなのもあったような気がするけど気のせい?
誰か、これらの関数の違いについて分かり易く教えてください。

590 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 13:40:56 ]
文字として wchar_t を使うとき -> wcscmp
文字として char で mbcs を使うとき mbscmp
文字として char で sbcs を使うとき strcmp
文字として TCHAR を使うとき lstrcmp

ドキュメント読まずにまず2chで聞くという態度では、わからなくて当たり前。


591 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 13:49:11 ]
>>590
すみません。それがいまいちよくわからないんです。
charを使うときとか、tcharを使うときと言われても抽象的すぎて???
具体的に、どういう処理をするときにmbscmp や strcmp などを使い分けるのでしょうか?
同じ文字列比較でも、mbscmp を使っていたり、 strcmp を使っていたりと、訳が分りません。

592 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 13:52:17 ]
>>587
確かに…ご指摘ありがとうございます
アセンブリ言語を実行するものの意味で使いました

593 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 13:52:50 ]
>>591
それは抽象的だからわからないんじゃなくて、勉強しないからわからないのです。
mbcs と sbcs の違いなんか、Google で 「mbcs と sbcs の違い」を(カッコははずして)
検索すればいくつもそれらしい説明のページが出てくるのです。

もし手抜きじゃなくてホントのホントに何もしないで知識が身に付くと思ってるのなら、
そもそもバカなので勉強しても無駄なので止めるべきです。

594 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 14:04:17 ]
>>592
それは普通、アセンブラと呼ばれる。
いや、厳密に言えば「アセンブリ言語を翻訳するもの」だが。

595 名前:デフォルトの名無しさん [2008/04/11(金) 14:05:02 ]
>>593
なんか嫌なことでもあったのか?

596 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 14:05:03 ]
なんとなく分ったような分らないような・・・・

同じ英数字からなる文字列比較でもプログラムによって使っている関数が違うのは
書き手(プログラマー)の意識の違いによる?
さらにワイド文字とマルチバイト文字の違いがよく分らん。。。。

出直してきます。スレ汚してすみません。

597 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 14:06:53 ]
すまん
*a = new double[x]
じゃなくて
a = new double*[x]


598 名前:デフォルトの名無しさん [2008/04/11(金) 14:20:42 ]
>>597
それだけじゃねーだろ。



599 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 15:19:15 ]
>>595
593じゃないけど、あえて言うなら「投げっぱなしの馬鹿を見てしまったこと」が
「嫌なこと」なんだろう。

600 名前:デフォルトの名無しさん [2008/04/11(金) 20:21:49 ]
deleteで落ちちゃうんだけど、原因わかりません><
このコードで落ちます・・・。

int i;
char *lpary[4];

for (i = 0; i < 4; i++){
lpary[i] = new char[256];
}

for (i = 0; i < 4; i++){
delete [] lpary[i];
}

誰か教えてください。

601 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 20:23:53 ]
落ちる要素は特に見当たらないが・・・。
多分、他で色々やってる部分でマズいことやってんじゃないかと。

602 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 20:24:46 ]

for (i = 0; i < 4; i++){
delete lpary[i]
}

delete[] lpary;

603 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 20:25:53 ]
>>602
おいおい^^;

604 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 20:26:53 ]
よく見てなかった
すまん忘れてくれ

605 名前:600 mailto:sage [2008/04/11(金) 20:29:44 ]
すいません。原因わかりました。
newとdeleteの間でやってる処理で確保したポインタに別のポインタ
渡してしまってた・・・。

まじごめん;;

606 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 20:30:25 ]
悪い事いわないから、vector 使え。

607 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 23:28:52 ]
>>596
>さらにワイド文字とマルチバイト文字の違いがよく分らん
それを調べるのが先だということに気づかないの?

608 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 23:30:06 ]
出直してくるって言ってるんだからほっとけよ



609 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 00:33:20 ]
変数をStringだとかChar型で指定することってできますか?

610 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 00:34:10 ]
????????

611 名前:デフォルトの名無しさん [2008/04/12(土) 00:56:30 ]
静的なメモリを確保をしたクラス内に動的に確保したクラスがあるとします
この場合exit(0)が実行された時に正しく破棄が行われますでしょうか?

612 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 00:59:02 ]
>>611
だいたいOSがうまく解放してくれる・・・かもね。
そんな保障はどこにもない。ちゃんと解放するかJava等に移行しましょう。

613 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 01:14:07 ]
ぬるぽ

614 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 01:15:38 ]
>>611
ライブラリの仕様によるけど、
・静的なオブジェクトのデストラクタ⇒呼ばれる
・main()から辿ってその時点までのスタック上にあるオブジェクトのデストラクタ⇒呼ばれない
つまりスタックの巻き戻しは行われないが通常のクリーンアップルーチンは呼ばれる、
が一般的なのでは。何か重要な後処理が必要なら atexit でも書いとくべきだな。

615 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 01:34:05 ]
atexitを使うことにします
ありがとうございます

616 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 02:10:32 ]
constポインタpDataのメンバstd::deque<Log> LogDataを参照するpastLog

const std::deque<Log>& pastLog = pData->LogData

を上のように作ってそのiteratorを使用したいのですが
const std::deque<M3Log>::iterator itr = pastLog.begin();
とすると

左オペランドを扱う演算子が見つかりません (または変換できません) (新しい動作; ヘルプを参照)。

と怒られます

何処をどうしていいのかわかりません、アドバイスをいただけないでしょうか

617 名前:616 mailto:sage [2008/04/12(土) 02:12:31 ]
訂正
const std::deque<M3Log>::iterator itr = pastLog.begin();

const std::deque<Log>::iterator itr = pastLog.begin();

618 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 02:12:40 ]
c++ は良く知らないけど、
std::deque<Log>::const_iterator itr = pastLog.begin();
じゃないの?



619 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 02:19:58 ]
>>618
ありがとうございます
無事コードがコンパイルを通るようになりました

const_iteratorなんてあったのか・・・

620 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 03:41:33 ]
>>619
>const_iteratorなんてあったのか・・・
超ワロタじゃないかよ


621 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 04:19:52 ]
静的確保と動的確保でプライベートメンバ関数の実行に違いが出るようなことは有るでしょうか?

622 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 09:55:51 ]
外から借りない限り終了すれば仮想プロセス空間ごと消滅するかと。

623 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 11:01:31 ]
さあて。delete thisするんでない限りは、まー無いんでないかね。

624 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 12:57:40 ]
#define sucide delete this

625 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 14:40:30 ]
suicide

626 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 14:49:06 ]
oh misu superu

627 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 14:50:30 ]
ifの条件部で変数を宣言したい時に、boolとして評価できない型だとコンパイルエラーになりますよね

std::set::const_iterator it = hoge.find(....);
if (it != hoge.end()) {
// ここで it を使う
}
のようなことをするときにifのブロック内にitのスコープを限定して
if ((std::set::const_iterator it = hoge.find(...)) != hoge.end()) {
のようなことをしたいんですけど無理ですか?


628 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 15:23:43 ]
無理



629 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 15:39:39 ]
for ( std...it = hoge.find(...); it != hoge.end(); ) {
 break;
}

おすすめはしない

630 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 15:40:03 ]
{ std::set::const_iterator it; if(...){...} }

631 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 15:40:50 ]
あるいは空スコープを使うとか。

{
 std...it = ...:
 if(){
 }
}


632 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 15:54:26 ]
無理やり
template<typename T, template<class> class Comp> class eval_lapper
{
public:
    eval_lapper( std::pair<T, T> rhs ) : obj_(rhs.first), target_(rhs.second) {}
    operator bool() const { return Comp<T>()(obj_, target_); }
    T& obj() { return obj_; }
    const T& obj() const { return obj_; }

private:
    T obj_;
    T target_;
};

int main()
{
    std::set<int> s;
    //s.insert(123);
    if( eval_lapper<std::set<int>::const_iterator, std::not_equal_to > it = std::make_pair( s.find(123), s.end() ) )
        std::cout << *(it.obj()) << std::endl;
    return 0;
}

633 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 15:57:33 ]
ifの評価部分ってboolのオーバーロードがあったらちゃんとboolとして評価してくれるの?

634 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 15:58:44 ]
してくれるが、if 文以外の所でも本当に bool 値として解釈されて欲しい場合でなければ bool のオーバーロードはすべきじゃない。

635 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 16:00:12 ]
if 文だけでそう解釈されて欲しい場合は、
普通には使われないようなポインタへのキャスト演算子を
オーバーロードするのが一般的。
メンバポインタとか。

636 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 16:41:51 ]
>>632
面白いなやり方だな
でも、lapper => wrapper じゃね

637 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 16:53:02 ]
//test.h
struct test{
 int a;
 test(int a_) : a(a_){}
};

//instance.cpp
#include "test.h"
test obj(1024);

//program.cpp
#include <iostream>
#include "test.h"
extern test obj;

int main(){
 std::cout << obj.a << std::endl;
 return 0;
}

別々の翻訳単位に型testが定義されてるけど、同一の型として認識されるの?
VC8ではコンパイル通った。

638 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 17:01:05 ]
そりゃ通るだろ

同じヘッダインクルードしてるんだし



639 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 17:01:59 ]
メンバ変数が一部が#ifdefあたりで囲んであると
場合によっては非常に愉快な話になるけどね

640 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 17:09:35 ]
愉快なというかバグな話だろ

641 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 22:59:36 ]
中々原因が掴めず笑うしかないとかそういうアレだろう
鼻から悪魔が出たらもっと愉快だな

642 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 22:40:49 ]
String name;

String^ name;
の違いはなんですか?ハンドルの意味がわかりません

643 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 22:48:53 ]
>>642
C++/CLI はスレ違いなのです。

C++/CLI part3
pc11.2ch.net/test/read.cgi/tech/1206447234/

644 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 22:50:41 ]
>>642
とりあえず「C++/CLI ハンドル 自動変数」でググったら説明が見つかると思う。
それで分からなかったら、もう一度おいで。

# CLIってちょい過疎気味の本スレしか無いのな

645 名前:デフォルトの名無しさん [2008/04/14(月) 01:32:44 ]
コピーコンスタクタ辺りで質問です。

template <bool M> struct P {
int* _p;

P(int* v=NULL) : _p(v) {}
P(P& v) : _p(v.release()) {} // (1)
~P() { if(M && _p) delete _p; }

void reset(int* v=NULL)
{ if(M && _p && _p != v) delete _p; _p = v; }

int* release()
{ int* temp = _p; _p = NULL; return temp; }
};

P<true> pf(int n) { return P<true>(new int(n)); }

int main() { P<true> a = pf(3); }

上記だと
error: no matching function for call to ‘P<true>::P(P<true>)’
とコンパイルエラーがでます。 しかし (1) を

template <bool _M> P(P<_M>& v) : _p(v.release()) {}

にするとエラーにならずにコンパイルできるようになります。なぜコンパイルエラーがでなくなるのでしょうか? コンパイラは gcc version 4.0.1 (Apple Inc. build 5465) です。


646 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 01:43:50 ]
>>645
コピーコンストラクタをテンプレート関数にして異なるテンプレート引数の型でも受け取れられるれりれるようにしたから。

647 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 01:46:07 ]
>>645
よく分からんけど、VC8だとどちらもコンパイル通ったぞ

648 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 01:49:12 ]
>>647
エスパーすると645は(1)をP(P& v) : _p(v.release()) {}とした上でソースコードのどこかで
P<false> oldObj;
P<true> newObj(oldObj);
とでもしているんだろう。



649 名前:645 [2008/04/14(月) 01:52:20 ]
>>646
テンプレート引数の型は書き変える前も後も true しか扱わないのに異なる型を受け取れるようにしないと
いけない理由が分かりません。
途中で P<false> に変換されているのも確認できませんでした。

>>647
gcc だけで起きる問題なんでしょうか…

>>647
いやしてないのです。上記のソースのみです。

650 名前:デフォルトの名無しさん [2008/04/14(月) 02:17:53 ]
質問です。4桁の乱数を取得する関数なのですが
if(num[i] == num[j])以降のdowhileで必ずループに入ってしまうのですが
原因を教えていただけませんか?
void random::gt(){
srand((unsigned) time(NULL));
num[0] = rand() % 10;
if(num[0] <= 0){
do{
num[0] = rand() % 10;
}while(num[0] <= 1);
}
//その他乱数取得
for(i=0;i<4;i++){
if(i <= 4){
for(j=1;j<4;j++){
num[j] = rand() % 10;
if(num[i] == num[j]){
do{
num[j] = rand() % 10;
system("PAUSE");
}while(num[i] != num[j]);
}
};
}
};
}

651 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 02:47:43 ]
>>649
Pは接頭語みたいなもので一部の例外を除いて単独では使えない
この場合だとP<true>とP<false>が型
たとえばP<true>を定義したとき、もしP(P&)の記述が許されると
コピーコンストラクタP(P<true>)か
引数付きのコピーじゃないコンストラクタP(P<false>)か曖昧になる

652 名前:>650 mailto:sage [2008/04/14(月) 03:22:48 ]
日本語でおk

dowhileは必ず1回はループ内の処理を実行するが?
あと、その貼ったソースはそのままか?変更して貼ってない?



653 名前:645 [2008/04/14(月) 03:33:40 ]
>>651
あーなるほど。コピーコンストラクタかコンストラクタが曖昧になるんですね。
P<true> -> P<false> の変換がされると嫌で書き方に困っていたのですが

P<true> -> P<true> OK
P<true> -> P<false> OK
P<false> -> P<false> OK
P<false> -> P<true> NG
の時に

template <bool M>
struct P {
template <bool _M> P(P<_M>& v);
...
};

template <> template <> P<true>::P(P<true>& v) : _p(v.release()) {}
//template <> template <> P<true>::P(P<false>& v); // NG
template <> template <> P<false>::P(P<false>& v) : _p(v._p) {}
template <> template <> P<false>::P(P<true>& v) : _p(v._p) {}

みたいにもできるってことですね!ありがとうございました。


654 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 03:33:47 ]
あああ、すいません

if(num[i] == num[j]){のところで
変数num[i]とnum[j]が違っていても処理をしてしまう原因

を知りたかったのです
ソースは特に変えてないと思うのですが
どこかおかしいでしょうか

655 名前:645 [2008/04/14(月) 03:36:18 ]
違った。P<false> -> P<true> が嫌だった。です。


656 名前:650 mailto:sage [2008/04/14(月) 03:39:19 ]
またもすいません
>>654は>.650です・・・

657 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 09:29:44 ]
>>650
i が 0 から 3 をとりながら動き、
そのループのなかで j が 0 から 3 をとりながら動くんですよね。
すると, i = j ならば, num[i] == num[j] となって、system("pause") がかならず
実行されることになります。

なさりたいことは、こんなのでしょうか?
(確認環境 WindowsXP, 処理系 cygwin(gcc 3.4.4)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6239.txt

658 名前:650 mailto:sage [2008/04/14(月) 11:06:42 ]
>>657
まさにそんな感じです
ありがとうございます



659 名前:657 mailto:sage [2008/04/14(月) 11:24:42 ]
>>658
バグってました。
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6240.txt

660 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 14:51:59 ]
set<Class> a, b;とあってaからbに含まれていない要素を取り除きたいときに
remove_ifなんかのアルゴリズムでスマートに書けますか?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<246KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef