60954


現在、RAD Studio 10.3でプログラミングを行っています。  
Indy9のコンポーネントで作成されたものをIndy10に置き換えています。  
ServerConnectメソッドで次のところでエラーが出てきました。

このエラーの回避方法を教えて下さい。

[code]

    void __fastcall TfrmMain::ServerConnect(TIdContext *AContext)
    
    //-----(中略)--------------------------
    
    pDev = AddDev(pPkt,inet_addr(AContext->Connection->Socket->Binding->PeerIP.c_str()));
    
    //-----(中略)--------------------------
    
    }
    
[/code]

**エラー内容**

[code]

    [bcc32c エラー] Main.cpp(566): no matching function for call to 'inet_addr'
      winsock2.h(1831): candidate function not viable: no known conversion from 'wchar_t *' to 'const char *' for 1st argument
    
[/code]


CC BY-SA 4.0
2019-11-30T03:17:59.690
60953
2019-11-30T07:36:41.330
2019-11-30T07:36:41.330
35993
35993
question
c++ delphi rad-studio
inet_addr()という関数でエラーがでる


修正しました。

[code]

    char ch[xx];  // xxは文字列が入る大きさ以上の値
    strcpy(ch, AnsiString(AContext->Connection->Socket->Binding->PeerIP).c_str());
    pDev = AddDev(pPkt,inet_addr(ch));
    
[/code]

でどうでしょう？


CC BY-SA 4.0
2019-11-30T04:08:41.910
60954
2019-11-30T06:27:26.147
2019-11-30T06:27:26.147
24490
24490
60953
answer


ここの記事の内容が同様に当てはまるのでは？ `AnsiString`に変換するのが簡単そうですね。  
だから@池田茂樹 さん回答のように1段階処理を挟むか、下記記事のようにインラインで変換するかすれば良いのでは？

[C++Builder2009におけるStringの変更による既存コードの修正](https://www.gesource.jp/weblog/?p=543)

> C++Builder2007まではコンパイルできた次のコードが、C++Builder2009ではコンパイルエラーになります。
[code]

>     String dir = "C:\\日本語.txt";
>     FILE* f = fopen(dir.c_str(), "rt");
>  
>     [BCC32 エラー] File1.cpp(14): E2034 'wchar_t *' 型は 'const char *' 型に変換できない
>     [BCC32 エラー] File1.cpp(14): E2342 パラメータ '__path' は const char *
> 型として定義されているので wchar_t * は渡せない
>  
[/code]

>
> **StringがAnsiStringからUnicodeStringに変わったため、String#c_str()の返す型がchar
> _からwchar_t_ に変わりました。**  
>  fopenには引数にchar _を受け取るfopen(char_ )はありますが、wchar_t _を受け取るfopen(wchar_t_
> )は存在せず、C++Builder2009ではコンパイルエラーになります。  
>  **C++Builder2009でも一度AnsiStringに変換するか、_wfopenを使えば、コンパイル可能です。**
[code]

>     # AnsiStringに変換
>     FILE* f = fopen(AnsiString(dir).c_str(), "rt");
>  
>     # _wfopenを使用
>     FILE* f = _wfopen(dir.c_str(), L"rt");
>  
[/code]

* * *

以下の記事の例を考えれば、`inet_addr`に渡すパラメータの型が合っていないのでしょう。

[No matching function for call to エラー
原因別の対処方法](https://marycore.jp/prog/cpp/no-matching-function-for-call-to/)

> これは関数呼び出しが正常に行えないという趣旨のメッセージで、原因はいくつか考えられる。  
>  関数  
>  引数の型が一致しないケース  
>  引数型が合っていないと呼び出せないのでエラーになる。
[code]

>     void fn(int v) {}
>  
>     fn(99); // OK
>     fn(""); // No matching function for call to 'fn'
>  
[/code]

>
> 関数側の定義をきちんと確認せよ。


CC BY-SA 4.0
2019-11-30T05:08:25.633
60956
2019-11-30T07:12:53.437
2019-11-30T07:12:53.437
26370
26370
60953
answer