我正在尝试使用MSVS 2017从C++ library构建一个例子
cmake_minimum_required(VERSION 3.1)
set(CMAKE_C_COMPILER "gcc")
set(CMAKE_CXX_COMPILER "g++")
project(index VERSION 1.0.0 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
file(GLOB_RECURSE SourceFiles "src/*.cpp" "src/*.h")
add_executable(${PROJECT_NAME} ${SourceFiles})
我遇到几个问题:
#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;
}
不确定,我能够使用g ++很好地构建示例。
答案 0 :(得分:3)
注释指出了问题-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_;
} ();