4

我遵循 的定义CFileDialog,但 VS2013 仍然告诉我没有可用于我传入的参数的构造函数。

我的代码:

CFile theFile;
char strFilter[] = { "TXT Files (*.txt)|*.txt|All Files (*.*)|*.*||" };
CFileDialog fDlg = CFileDialog(TRUE, ".txt", NULL, 0, strFilter);

产生的错误:

1 IntelliSense:没有构造函数“CFileDialog::CFileDialog”的实例与参数列表参数类型匹配:(int, const char [5], int, int, char [46]) c:\Users\Jonathan\Documents\Visual Studio 2013\项目\SDI\SDI\MainFrm.cpp 131 21 SDI

CFileDialog以及供参考的构造函数:

explicit CFileDialog(BOOL bOpenFileDialog, // TRUE for FileOpen, FALSE for FileSaveAs
    LPCTSTR lpszDefExt = NULL,
    LPCTSTR lpszFileName = NULL,
    DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
    LPCTSTR lpszFilter = NULL,
    CWnd* pParentWnd = NULL,
    DWORD dwSize = 0,
    BOOL bVistaStyle = TRUE);

有什么问题?

4

2 回答 2

5

问题似乎是您使用了不正确的字符串类型。

快速解决方案是使用TCHAR而不是char. 更好的解决方案是只使用宽字符串并确保构建是 Unicode。

在 Visual Studio 中创建项目时,使用的默认字符集类型是 Unicode,而不是 MBCS,也不是“未设置”。这意味着采用字符数组和指针的 Windows API 和 MFC 函数将使用宽字符。因此,在需要宽字符串的 Windows API 函数上使用char, char *, , 将无法编译。const char*

即使您对 Unicode 或 MBCS 一无所知,表明您的代码错误的迹象是,您调用的函数采用的类型LPCTSTR不是a ,而是const char *它的本质,即指向 a 的常量指针TCHAR。如果您坚持知道使用指定的类型,那么您会很高兴。

所以教训是,如果一个函数需要一个类型,请提供该类型的变量或表达式,而不是您认为该类型等价的内容。

于 2014-11-20T21:10:26.273 回答
2

好的。因此,我将代码更改为以下内容:

CFile theFile;
TCHAR strFilter[] = { _T("TXT Files (*.txt)|*.txt|All Files (*.*)|*.*||") };
CFileDialog fDlg = CFileDialog(TRUE, _T(".txt"), NULL, 0, strFilter);

而且,现在没有任何问题。谢谢您的反馈!

于 2014-11-20T21:14:37.160 回答