9年前WinsockAPIのラッパークラスのようなものをつくろうとしています。以下のようなエラーが出てきました。)===エラーここまで====================================================================メンバ関数がスレッドのエントリポイントとして使えないことが原因だと考えています。Flag=TRUE;while(Flag){ret=recv(ClientSock,buf,2048,0);if(ret>0){//ゆくゆくはここはコールバックにしたい。メンバ関数がスレッドのエントリポイントとして使えないことが原因だと考えています。この問題を、解決する方法はありますでしようか?原因はそのとおりでしょうね。クラスメンバー関数は元々インスタンスオブジェクトへのポインタが隠れ引数として渡されています。型ではないのでエラーになります。これを回避するには対象を静的関数にしてしまいます。引数に渡しているんだから問題はないと思います。クラスメンバを使用する場合には引数をクラスポインタにキャストして使用します。内部処理}としてもコンパイルを通すことはできません。9年前>maruさんありがとうございます。スレッドの部分を静的関数にして、ClientSockへは引数をキャストしてアクセスしようとしましたが、以下のようなエラーが出てきました。)===エラーここまで=====================================================================TcpListener01が見つからないようなのです。試しに、スレッドの部分をTcpListener01クラスよりあとに書いたら、今度はReadThreadが見つからないと言われてしまいました。Flag=TRUE;while(Flag){ret=recv(p->ClientSock,buf,2048,0);if(ret>0){//ゆくゆくはここはコールバックにしたい。9年前maruさんの言われるstatic(静的)関数というのは、クラス内の静的関数という意味だと思いますけど。方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。9年前>softyaさんありがとうございます。スレッドの部分をクラスにクラス内の静的関数にしてみました。ところが、ClientSockへアクセスするために作った、TcpListener01クラスへのポインタのpが使えないようなエラーが出てきました。Flag=TRUE;while(Flag){ret=recv(p->ClientSock,buf,2048,0);if(ret>0){//ゆくゆくはここはコールバックにしたい。9年前staticメンバ関数から、staticではないメンバ変数であるpは見えませんよ。[追記]私なら一旦static関数でスレッドの入り口だけを作っておいて、実際に処理するメンバ関数を別に呼び出しますね。p->RecvThreadMain();こうすれば、あとは普通のメンバ関数RecvThreadMain()で処理できます。(注)RecvThreadMainはpublicなメンバ関数である必要があります。[さらに追記]あと余計なおせっかいですが、メンバ変数が何でもかんでもpublicに成っているので、どうしても外部公開する必要性のある物を除いてprivateにしたほうが良いと思います。それとWSAStartupはクラス外に出すか、クラス自体をシングルトン・パターンにしてWSACleanup();を含めてコンストラクタ/デストラクタで処理するのが良いかと思いますよ。方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。私の書いた内容がちゃんと理解できていなかったんですね。>スレッドの部分を静的関数にして、ClientSockへは引数をキャストしてアクセスしようとしましたが、以下のようなエラーが出てきました。)===エラーここまで=====================================================================TcpListener01が見つからないようなのです。試しに、スレッドの部分をTcpListener01クラスよりあとに書いたら、今度はReadThreadが見つからないと言われてしまいました。何か良い方法はありますでしようか?これを見るとc/c++の知識も怪しいようです。・クラス宣言より前の関数でクラスを使用するすることはできない。・関数宣言より前でその関数を使用することはできない。これらの問題に対処するためにヘッダファイルに宣言だけを分離しておきます。以下のメンバー関数は省略};別のソースファイルでその関数の実装を書きます。softyaさんのコードを持ってきました。以下、他のメンバー関数また、クラス宣言の最後の余分なものが付いています。ここ!これはTcpListener01型のクラスオブジェクトをTcpListener01と言う名前でグローバルに宣言することになります。いう意図で書いたのであればいいのですが、多分違いますよね。これをつけたままヘッダファイルにして複数のソースファイルでインクルードすると、また別のエラーで悩まされることになります。つけないとエラーになったからではないでしょうか?その原因は、すべて、クラス宣言後の文字列です。つける必要がありません。クラス名と変数名か区別が付かないのでエラーになります。返信が遅くなりすみません。>softyaさんどの変数が見えて、どの変数が見えないのかが理解がよく出来ていませんでした。勉強してみようと思います。>こうすれば、あとは普通のメンバ関数RecvThreadMain()で処理できます。いろいろなテクニックがあるのですね。なんでもpuclicになっているのは、特に考えていなかったからですが、WSAStartupが扱いづらそうだったので、シングルトン・パターンについても勉強してみようと思います。>maruさんクラス以前に、曖昧な部分がたくさんあるようです。はじめは混乱しましたが、丁寧な解説でよくわかりました。ありがとうございます。無事に実装することができましたが、よく理解出来ていない部分が多いのでこれから勉強していこうと思います。これにて解決にさせていただきたいと思います。ありがとうございました。ミクプラは自由にリンクできます。