【问题标题】:why do i get the error and ...?为什么我得到错误和...?
【发布时间】:2026-01-15 23:25:01
【问题描述】:

在我的程序中,我声明了一个函数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)

为什么会出现这个错误?我该如何解决它们?

我的第二个问题是:

  • 我已经声明了nameofPrinter 类型的变量LPTSTR,但是当我编写语句getline( cin , nameOfPrinter ) 时,显示的错误是重载函数getline 的实例与参数列表不匹配。那我怎么才能收到用户的nameOfPrinter呢?

【问题讨论】:

    标签: c++ windows visual-c++ printing


    【解决方案1】:

    第一个问题的答案:

    error C2061: syntax error : identifier 'string'
    

    您需要在声明函数的头文件或源文件中包含string 头文件,例如:

     #include <string>
    

    &

    namespace std;应该包含在您的源文件中 喜欢:

    using namespace std;
    

    或者 或者,您应该使用:

    std::string
    

    第二个问题的答案:

    istream::getline()istream 类中的一个函数,具有以下重载版本:

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

    显然,它不理解您定义的LPTSTR 类型,因此它告诉您没有匹配的函数调用将LPTSTR 作为参数。

    如何解决?
    在 cmets @Cody Gray 中,向您解释了真正的问题,解决方案当然是建议将 LPTSTR 转换为一种格式,以便它与 istream::getline() 参数匹配,这实际上意味着转换您在 wchar_t* 中的字符串使用 wcstombs()

    char*

    【讨论】:

    • 显然你没有尝试正确。这是正确的答案......虽然我已经写了using std::string;,甚至没有提到using namespace的可能性:-)
    • 还有,你有没有把 std:: 放在函数原型中的字符串之前?
    • @Als 那么有没有其他方法可以接收LPTSTR 类型的nameOfPrinter
    • @SuhailGupta:问题在于LPTSTR是根据程序是否编译为Unicode而有条件地定义的。如果是这样,LPTSTR 被定义为wchar_t*。否则,它被定义为char*。问题是所有 Win32 应用程序现在都应该使用定义的 Unicode 进行编译。所以LPTSTRistream::getline() 的函数定义不匹配,它接受char* 而不是wchar_t*。您需要将窄字符转换为宽字符才能成功。
    【解决方案2】:

    您的文件需要包含以下行:

    #include <string>
    

    头文件string 包含string 类的定义。因为该类位于 std 命名空间内,所以函数原型必须是:

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

    由于您在原型中使用LPTSTR,因此您必须使用 Visual C++。如果您的项目设置为使用 Unicode 字符集而不是多字节字符集,您需要相应地调整您的类型。

    对于 Unicode 字符集:

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

    或者,您可以将字符串的类型声明为:

    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 );
    

    【讨论】:

    • 您可能想要#ifdef _UNICODE,否则这是一个很好的答案。将typedef 用于std::basic_string&lt;TCHAR&gt;,并在您的应用程序中使用它。
    • @Cody Gray:很好,显然 Windows SDK 标头寻找 UNICODE 而 crt 寻找 _UNICODE。所以看起来你应该同时寻找。
    • 好吧,如果您包含 Windows SDK 标头,那么 CRT 标头将始终存在。检查_UNICODE 是通用选项。在 99% 的情况下,这无关紧要。但是这里有很多关于 SO 的 1% 的问题。 :-)
    【解决方案3】:

    但由于此语句,我收到以下错误:错误 C2061: 语法错误:标识符“字符串”

    您需要#include &lt;string&gt; 并使用using namespace std; 或将string 声明为std::string 以使用string 类。

    显示的错误是没有重载函数getline的实例 匹配参数列表。

    getline() 的第二个参数是对std::string 的引用。 Apparently LPTSTR is not std::string。请改用std::string

    看起来您正在开发 GUI 应用程序。你为什么要使用cin 输入?

    【讨论】:

    • 是什么让您“看起来”像一个 GUI 应用程序? LPTSTR 在 Windows 标头中有条件地定义,具体取决于您是否将应用程序编译为 Unicode。所以它要么是*char_t*,要么是char*。这种类型在std::string 被发明之前存在很长时间
    • @cody gray:OP 的标签之一是visual-c++
    • 是的,您可以在 Visual C++ 中创建非 GUI 应用程序。这只是微软对其 C++ 实现的称呼。没有什么神奇的东西可以限制您使用 GUI 应用程序。特别是,您可以创建在桌面上的控制台窗口中运行的控制台应用程序。它们不显示任何 UI。
    最近更新 更多