没有关于“向量的初始化匹配构造 '与铛++ 3.2 [重复](no matching

2019-07-19 20:57发布

这个问题已经在这里有一个答案:

  • 是这样的初始化列表合法的C ++ 11? 1个回答

我正在学习C ++与C ++入门,第5版..

我试图编译一个简单的C ++程序用C ++ 11个功能铿锵++,但我发现编译什么应该是合法的代码错误。

这是一个例子:

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main(){
  int n = 0;
  auto *p = &n; //<-- this compiles  

  cout << *p << endl;

  vector<string> articles = {"a", "an", "the"}; //<-- this fails; copied from the book

  return 0;
}

这是完整的错误:

$ clang++ -std=c++11 -v test.cpp -o test
clang version 3.2 (tags/RELEASE_32/final)
Target: x86_64-apple-darwin10.8.0
Thread model: posix
 "/usr/local/Cellar/llvm/3.2/bin/clang" -cc1 -triple x86_64-apple-macosx10.6.0 -emit-obj -mrelax-all -disable-free -main-file-name test.cpp -mrelocation-model pic -pic-level 2 -mdisable-fp-elim -masm-verbose -munwind-tables -target-cpu core2 -target-linker-version 127.2 -v -resource-dir /usr/local/Cellar/llvm/3.2/bin/../lib/clang/3.2 -fmodule-cache-path /var/folders/pk/pkIeYbRaF-yeeUH3Q6Q5AE+++TI/-Tmp-/clang-module-cache -std=c++11 -fdeprecated-macro -fdebug-compilation-dir /Users/Oton/Desktop -ferror-limit 19 -fmessage-length 150 -stack-protector 1 -mstackrealign -fblocks -fobjc-runtime=macosx-10.6.0 -fobjc-dispatch-method=mixed -fobjc-default-synthesize-properties -fencode-extended-block-signature -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -o /var/folders/pk/pkIeYbRaF-yeeUH3Q6Q5AE+++TI/-Tmp-/test-w65CaF.o -x c++ test.cpp
clang -cc1 version 3.2 based upon LLVM 3.2svn default target x86_64-apple-darwin10.8.0
#include "..." search starts here:
#include <...> search starts here:
 /usr/include/c++/4.2.1
 /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64
 /usr/include/c++/4.2.1/backward
 /usr/include/c++/4.0.0
 /usr/include/c++/4.0.0/i686-apple-darwin8
 /usr/include/c++/4.0.0/backward
 /usr/local/include
 /usr/local/Cellar/llvm/3.2/bin/../lib/clang/3.2/include
 /usr/include
 /System/Library/Frameworks (framework directory)
 /Library/Frameworks (framework directory)
End of search list.
test.cpp:13:18: error: no matching constructor for initialization of 'vector<string>'
  vector<string> articles = {"a", "an", "the"};
                 ^          ~~~~~~~~~~~~~~~~~~
/usr/include/c++/4.2.1/bits/stl_vector.h:255:9: note: candidate constructor [with _InputIterator = const char *] not viable: no known conversion from
      'const char [4]' to 'const allocator_type' (aka 'const std::allocator<std::basic_string<char> >') for 3rd argument
        vector(_InputIterator __first, _InputIterator __last,
        ^
/usr/include/c++/4.2.1/bits/stl_vector.h:213:7: note: candidate constructor not viable: no known conversion from 'const char [2]' to 'size_type'
      (aka 'unsigned long') for 1st argument
      vector(size_type __n, const value_type& __value = value_type(),
      ^
/usr/include/c++/4.2.1/bits/stl_vector.h:201:7: note: candidate constructor not viable: allows at most single argument '__a', but 3 arguments were
      provided
      vector(const allocator_type& __a = allocator_type())
      ^
/usr/include/c++/4.2.1/bits/stl_vector.h:231:7: note: candidate constructor not viable: requires single argument '__x', but 3 arguments were provided
      vector(const vector& __x)
      ^
1 error generated.

我在Mac上,10.6.8,我建立与选择自制LLVM /铛:

brew install llvm -v --all-targets --rtti --shared --with-asan --with-clang --use-clang

我究竟做错了什么?

Answer 1:

这个错误告诉你,有没有性病::矢量构造服用初始化列表。 问题是,您使用的是标准库的实现没有为C ++ 11更新。 您正在使用GCC 4.2版本的libstdc ++,这是以前C ++编写的11年。

你必须切换到已更新为C ++ 11的库。 如果你的libc ++安装那么你可以做只使用标志-stdlib=libc++ 。 我认为的libc ++二进制是OS X 10.6.8的一部分,但你还需要头。 也许自制了一个偏方,或者你可以下载它们: http://libcxx.llvm.org/并把它们粘在适当的位置找到发现与使用-stdlib=libc++

或者您也可以手动离开了正常的C ++标准库头(海合会在这种情况下,4.2的)与-nostdinc++ ,手动添加包括无论你坚持标题目录,添加库搜索目录的任何地方二进制文件(可以甚至建立二元自己),并添加链接标志-lc++



Answer 2:

我不知道这是很好的规范,但我会回答我的问题。 我希望这会帮助别人。

(我只是个初学者,所以如果我做错了,请大家指正。)

打造上面的例子中,唯一的方法是:

-std=c++11 -stdlib=libc++ -nostdinc++ -I/path/to/new/libcxx/include

问题是雪豹,正如其他人在这里说,有一个很旧版本的GCC。 并使用上述选项失败,因为的链接ld: library not found for -lc++

所以,我必须建立一个最近libcxx的版本。 有一个MacPorts的端口,但没有配方自制软件。 我内置手动,但有一些事情,我不得不到处去succede。

我假设你已经安装了LLVM用自制软件,你的路径设置正确: which clang++ -> /usr/local/bin/clang++

首先得到的libc ++ ABI: svn co http://llvm.org/svn/llvm-project/libcxxabi/trunk libcxxabi

然后得到的libc ++: svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx

编辑libc++abi/lib/buildit

EXTRA_FLAGS="...
             -I/usr/llvm-gcc-4.2/lib/gcc/i686-apple-darwin10/4.2.1/include \
             -I/PATH/TO/libcxx/include"
(Add the last two lines, note that the last include should point to the include folder inside libcxx from svn.)

LDSHARED_FLAGS="...-install_name /usr/local/lib/libc++abi.dylib"
(My libc++abi.dylib will reside inside /usr/local/lib.)

现在建的libc ++ ABI:

- cd libc++abi/lib 
- export TRIPLE=-apple-
- ./buildit

我更喜欢管理与自制我所有的第三方库,所以这是可选的:

- mkdir -p /usr/local/Cellar/libc++abi/HEAD/lib
- mkdir -p /usr/local/Cellar/libc++abi/HEAD/include
- cp -a *.dylib /usr/local/Cellar/libc++abi/HEAD/lib/
- cp -R /path/to/libcxxabi/include/ /usr/local/Cellar/libc++abi/HEAD/include/libc++abi
  (Note the / after include!)
- brew link libc++abi

现在编辑libc++/lib/buildit

if [ "$MACOSX_DEPLOYMENT_TARGET" == "10.6" ]
then
    EXTRA_FLAGS="... -I/usr/local/include/libc++abi"
    LDSHARED_FLAGS="...
        -install_name /usr/local/lib/libc++.1.dylib \
        ..."

现在建的libc ++:

- cd libc++abi/lib 
- export TRIPLE=-apple-
- export MACOSX_DEPLOYMENT_TARGET=10.6
- ./buildit

并再次可选:

- mkdir -p /usr/local/Cellar/libc++/HEAD/lib
- cp -a *.dylib /usr/local/Cellar/libc++/HEAD/lib
- mkdir -p /usr/local/Cellar/libc++/HEAD/include
- cp -R /path/to/libcxx/include/ /usr/local/Cellar/libc++/HEAD/include/libc++
- brew link libc++

现在我可以建立在前面的例子有:

clang++ -std=c++11 -stdlib=libc++ -nostdinc++ -I/usr/local/include/libc++ -O2 -g -v test.cpp -o test 


文章来源: no matching constructor for initialization of 'vector' with clang++ 3.2 [duplicate]
标签: c++ c++11 clang