c++ - 此语法中的构造函数转换错误

标签 c++ visual-studio

我正在尝试从 C++ library 构建一个示例使用 MSVS 2017

  #include <fstream>
  #include <vector>
  #include <algorithm>
  #include <iterator>
  #include <iostream>

  int main() {
      std::ifstream in("file.lib", std::fstream::in);

      const std::vector<char> buffer = []() {
        std::vector<char> buffer_(std::istreambuf_iterator<char>(in), std::istreambuf_iterator<char>());
        std::replace(buffer_.begin(), buffer_.end(), '\n', ' ');
        std::replace(buffer_.begin(), buffer_.end(), '\\', ' ');
        return buffer_;
      } ();

    return 0;
}


我遇到了几个问题:

λ cmake --build .
Microsoft (R) Build Engine version 15.9.21+g9802d43bc3 for .NET Framework
Copyright (C) Microsoft Corporation. All rights reserved.

  Checking Build System
  CMake does not need to re-run because C:/Users/mulderpa/cppsandbox/sdb2/build/CMakeFiles/generate.stamp is up-to-date.
  Building Custom Rule C:/Users/mulderpa/cppsandbox/sdb2/CMakeLists.txt
  CMake does not need to re-run because C:/Users/mulderpa/cppsandbox/sdb2/build/CMakeFiles/generate.stamp is up-to-date.
  main.cc
C:\Users\mulderpa\cppsandbox\sdb2\main.cc(18): error C2228: left of '.begin' must have class/struct/union [C:\Users\mulderpa\cppsandbox\sdb2\build\main.v cxproj]
C:\Users\mulderpa\cppsandbox\sdb2\main.cc(18): error C2672: 'std::replace': no matching overloaded function found [C:\Users\mulderpa\cppsandbox\sdb2\buil d\main.vcxproj]
C:\Users\mulderpa\cppsandbox\sdb2\main.cc(18): error C2780: 'void std::replace(const _FwdIt,const _FwdIt,const _Ty &,const _Ty &)': expects 4 arguments -  3 provided [C:\Users\mulderpa\cppsandbox\sdb2\build\main.vcxproj]
  C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\include\algorithm(1607): note: see declaration of 'std::repl
  ace'
C:\Users\mulderpa\cppsandbox\sdb2\main.cc(19): error C2672: 'std::replace': no matching overloaded function found [C:\Users\mulderpa\cppsandbox\sdb2\buil d\main.vcxproj]
C:\Users\mulderpa\cppsandbox\sdb2\main.cc(19): error C2780: 'void std::replace(const _FwdIt,const _FwdIt,const _Ty &,const _Ty &)': expects 4 arguments -  3 provided [C:\Users\mulderpa\cppsandbox\sdb2\build\main.vcxproj]
  C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\include\algorithm(1607): note: see declaration of 'std::repl
  ace'
C:\Users\mulderpa\cppsandbox\sdb2\main.cc(21): error C2440: 'initializing': cannot convert from 'std::vector<char,std::allocator<char>> (__cdecl *)(std:: istreambuf_iterator<char,std::char_traits<char>>,std::istreambuf_iterator<char,std::char_traits<char>> (__cdecl *)(void))' to 'std::vector<char,std::allo cator<char>>' [C:\Users\mulderpa\cppsandbox\sdb2\build\main.vcxproj]
  C:\Users\mulderpa\cppsandbox\sdb2\main.cc(21): note: No constructor could take the source type, or constructor overload resolution was ambiguous

不确定,我能够使用 g++ 构建示例。

最佳答案

评论说明了问题 - buffer_ 被解析为函数声明,参见 Most vexing parse .此外,您的 lambda 不会捕获绝对不应编译的 in 流。

解决方案是将 buffer_() 替换为 buffer_{} 并捕获 in:

const std::vector<char> buffer = [&in]() {
        std::vector<char> buffer_{std::istreambuf_iterator<char>(in),
                                  std::istreambuf_iterator<char>()};
        std::replace(buffer_.begin(), buffer_.end(), '\n', ' ');
        std::replace(buffer_.begin(), buffer_.end(), '\\', ' ');
        return buffer_;
      } ();

关于c++ - 此语法中的构造函数转换错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56505331/

相关文章:

visual-studio - Visual Studio 2005项目中的可部署内容……如何?

c# - TFS 找不到路径的一部分

visual-studio - TFS分支权限

c++ - 如何从 C 文件调用 C++ 构造函数

c++ - Boost::multi_array 性能问题

c++ 对象 vector ,包含动态分配的内存 - 'erase' 不起作用

c++ - 在运行时提升权限(Windows API C/C++)

visual-studio - Visual Studio 中代码重构(var 重命名)的键盘快捷键

visual-studio - 从 Visual Studio 2013 创建 nuget 包

c++ - 使用 "Default/Main"值创建 C++ 类(即 'string' )