为什么我会得到错误并且......?

时间:2011-07-14 07:45:16

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

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

3 个答案:

答案 0 :(得分:3)

回答第一个问题:

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作为参数。

如何解决?
在@Cody Gray的评论中,向您解释真正的问题,解决方案是建议以一种格式转换LPTSTR,以便它与istream::getline()参数凸轮匹配,这必然意味着转换您拥有的字符串使用 wcstombs()

wchar_t*char*

答案 1 :(得分: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 );

答案 2 :(得分:0)

  

但由于此声明,我收到以下错误:错误C2061:   语法错误:标识符'string'

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

  

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

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

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

进行输入