我在程序中遇到了下面提到的错误。什么是解决方案?

时间:2010-12-29 22:54:42

标签: c++

// Finaldesktop.cpp : Defines the entry point for the console application.
//
#include <iostream>
#include <string>
#include <vector>
#include <windows.h>
#include <conio.h>


using namespace std;




int SearchDirectory(vector<string> &refvecFiles,
                const string        &refcstrRootDirectory,
                const string        &refcstrExtension,
                bool                     bSearchSubdirectories = true)
{
string     strFilePath;             // Filepath
string     strPattern;              // Pattern
string     strExtension;            // Extension
HANDLE          hFile;                   // Handle to file
WIN32_FIND_DATA FileInformation;         // File information


strPattern = refcstrRootDirectory + "\\*.*";


hFile = FindFirstFile(strPattern.c_str(), &FileInformation);
if(hFile != INVALID_HANDLE_VALUE)
{
do
{
  if(FileInformation.cFileName[0] != '.')
  {
    strFilePath.erase();
    strFilePath = refcstrRootDirectory + "\\" + FileInformation.cFileName;

    if(FileInformation.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
    {
      if(bSearchSubdirectories)
      {
        // Search subdirectory
        int iRC = SearchDirectory(refvecFiles,
                                  strFilePath,
                                  refcstrExtension,
                                  bSearchSubdirectories);
        if(iRC)
          return iRC;
      }
    }
    else
    {
      // Check extension
      strExtension = FileInformation.cFileName;
      strExtension = strExtension.substr(strExtension.rfind(".") + 1);

      if(strExtension == refcstrExtension)
      {
        // Save filename
        refvecFiles.push_back(strFilePath);
      }
    }
  }
} while(FindNextFile(hFile, &FileInformation) == TRUE);

// Close handle
FindClose(hFile);

DWORD dwError = GetLastError();
if(dwError != ERROR_NO_MORE_FILES)
  return dwError;
}

return 0;

}

int main()
{
int iRC = 0;
vector<string> vecAviFiles;
vector<string> vecTxtFiles;


// Search 'c:' for '.avi' files including subdirectories
iRC = SearchDirectory(vecAviFiles, "c:", "avi");
if(iRC)
{
cout << "Error " << iRC << endl;
return -1;
}

// Print results
for(vector<string>::iterator iterAvi = vecAviFiles.begin();
  iterAvi != vecAviFiles.end();
  ++iterAvi)
cout << *iterAvi << endl;

// Search 'c:\textfiles' for '.txt' files excluding subdirectories
iRC = SearchDirectory(vecTxtFiles, "c:\\textfiles", "txt", false);
if(iRC)
{
  cout << "Error " << iRC << endl;
  return -1;
}

// Print results
for(vector<string>::iterator iterTxt = vecTxtFiles.begin();
  iterTxt != vecTxtFiles.end();
  ++iterTxt)
cout << *iterTxt << endl;

// Wait for keystroke
_getch();

return 0;
}

错误信息:

错误C2784:'std :: basic_string&lt; _Elem,_Traits,_Alloc&gt; std :: operator +(const std :: basic_string&lt; _Elem,_Traits,_Alloc&gt;&amp ;, const std :: basic_string&lt; _Elem,_Traits,_Alloc&gt; &amp;)':  无法推断'const std :: basic_string&lt; _Elem,_Traits,_Alloc&gt;的模板参数&安培;”  来自'WCHAR [260]' c:\ documents and settings \ compaq \ my documents \ visual studio 2008 \ projects \ finaldesktop \ finaldesktop.cpp 41 Finaldesktop

2 个答案:

答案 0 :(得分:2)

在我看来,您正在尝试将std::basic_stringWCHAR [260]连接起来。但是如果没有看到一些消息来源,我绝对不知道。众所周知,C ++错误代码很神秘。

答案 1 :(得分:0)

在没有看到代码的情况下,我可以告诉你一种方法可能会导致这样做:

WCHAR wstr[260];
std::string temp;
temp + wstr;

你会收到很多错误,包括你提到的上面的错误。但是,在这种情况下的问题是,添加的二元运算符无法将您声明并传递给函数的WCHAR数组转换为可与std :: string组合的形式。如果没有意义,第三行真的是做这样的事情:

temp.operator+(wstr);

然而,如果你做这样的事情你会没事的:

WCHAR wstr[260];
std::wstring temp;
temp + wstr;

根本问题是将宽字符与ansi字符组合在一起。如果这是预期的,您需要在调用操作符或复制构造函数之前转换您要在右侧传递的值。有许多方法可以通过使用std :: copy或Windows API(如MultiByteToWideChar等)来实现此目的。

编辑:

要关注原始问题,您的问题分为两个方面:

strFilePath = refcstrRootDirectory + "\\" + FileInformation.cFileName;
strExtension = FileInformation.cFileName;

WIN32_FIND_DATA struct将其cFileName成员定义为:

TCHAR    cFileName[MAX_PATH];

有关详细信息,请参阅上面的答案,但要点std::string基本上是std::basic_string<char>

在将此附加到std :: string或使用std::basic_string<TCHAR>std::wstring之前,您需要使用WideCharToMultiByte Windows API或其他一些转换方法。