2011-07-14 16 views
1

私のような機能prototypeを宣言:なぜエラーが出るのですか?...?私のプログラムで

void callToPrint(LPTSTR , LPVOID , DWORD , string)

しかし、私が原因この文に次のエラーを取得:error C2061: syntax error : identifier 'string'

functionことを教えても、コード内の他のエラーがあります。 4 arguments.

(error C2660: 'callToPrint' : function does not take 4 arguments)

を負いません。

なぜこのエラーが発生しますか?そして、どうすれば修正できますか?

私の2番目の質問は次のとおりです。

  • 私はタイプLPTSTRの変数nameofPrinterを宣言しているが、私は声明getline(cin , nameOfPrinter)を書くとき、表示されるエラーは、引数リストと一致するgetlineオーバーロードされた関数のインスタンスではありません。それでは、どうすればnameOfPrinterをユーザーから受け取ることができますか?

答えて

2

を使って、あなたのファイルは、以下の行を含める必要がありますクラス。そのクラスがstd名前空間内にあるので、関数のプロトタイプは、する必要があります:

void callToPrint(LPTSTR , LPVOID , DWORD , std::string); 

あなたはVisual C++を使用している必要があり、プロトタイプでLPTSTRを使用しているので。プロジェクトがマルチバイト文字セットの代わりにUnicode文字セットを使用するように設定されている場合は、それに応じてタイプを変更する必要があります。あなたのようにあなたの文字列の型を宣言することができ

std::wstring nameOfPrinter; 
std::getline(std::wcin , nameOfPrinter); 

または、::Unicodeの文字セットについては

残念ながら
std::basic_string<TCHAR> nameOfPrinter; 

、そのようなテンプレートクラスがcinwcinの切り替えのために存在していません。したがって、プリプロセッサに頼らざるを得なくなります。

#if defined(UNICODE) || defined(_UNICODE) 
    #define _tcin wcin 
#else 
    #define _tcin cin 
#endif 

std::basic_string<TCHAR> nameOfPrinter; 
std::getline(std::_tcin , nameOfPrinter); 
+0

これはすでに特定のステートメントを含んでいます –

+0

おそらく '#ifdef _UNICODE'が必要ですが、そうでない場合は良い答えです。 'std :: basic_string 'の 'typedef'を使って、代わりにあなたのアプリケーションで使用してください。 –

+0

@Cody Grey:うまくいけば、明らかにWindows SDKヘッダーは 'UNICODE'を探し、crtは' _UNICODE'を探します。それで、あなたは両方を探す必要があるように見えます。 – Praetorian

3

最初の質問への回答:

error C2061: syntax error : identifier 'string' 

あなたが好き、関数を宣言しているヘッダまたはソースファイルにstringヘッダーファイルをインクルードする必要があります。

#include <string> 

&

namespace std;以下のようなあなたのソースファイル に含まれるべきである。また

using namespace std; 

または 、あなたが使用する必要があります。2番目の質問へ

std::string 

回答:

istream::getline()istream内の関数でありますクラスオーバーロードされたバージョン:

istream& getline (char* s, streamsize n); 
istream& getline (char* s, streamsize n, char delim); 

LPTSTRの定義された型が分かりませんので、一致する関数呼び出しがないことがわかります。つまり、LPTSTRを引数とします。

解決方法コメント@Codyグレーで
、あなたの本当の問題を説明し、提案のような溶液は、それがessentialy char*wchar_t*であなたが持っている文字列を変換する意味istream::getline()パラメータは、一致CAMようなフォーマットでLPTSTRを変換することofcourseのですヘッダファイルstringがの定義が含まれてい

#include <string> 

wcstombs()

+0

私はすでにそれを含んでいます –

+1

明らかに*正しく*試していません。これは正解です...私は 'std :: string;を使用していて、' namespace'を使う可能性についても言及していませんでしたが、 –

+1

とstd :: beforeを関数に入れましたか?プロトタイプ? –

0

しかし、私はこれによるステートメントに次のエラーを取得する:エラーC2061: 構文エラー:識別子 'string' は

あなたが#include <string>に必要とどちらかstd::stringとしてusing namespace std;または宣言stringを使用stringクラスを使用します。

表示されるエラーは、オーバーロード関数のgetlineのインスタンスではありません 引数リストと一致しました。

getline()の2番目のパラメータは、std::stringへの参照です。 Apparently LPTSTR is not std::string。代わりにstd::stringを使用してください。

GUIアプリケーションを開発しているようです。 cinを入力している理由は何ですか?

+0

GUIアプリケーションの外観はどうですか? 'LPTSTR'は、あなたがUnicodeとしてアプリケーションをコンパイルしているかどうかによって、条件付きでWindowsヘッダに定義されます。だから、 '* char_t *'か 'char *'のどちらかです。この型は、 'std :: string'が考案される前に* long *存在していました。 –

+0

@cody gre:OPのタグの1つは 'visual-C++'です。 – Donotalo

+2

はい、Visual C++で非GUIアプリケーションを作成できます。これは、MicrosoftのC++実装の単なる名前です。 GUIアプリケーションにあなたを制限する魔法はありません。特に、デスクトップ上のコンソールウィンドウで実行されるコンソールアプリケーションを作成できます。 UIは表示されません。 –

関連する問題