clang libc ++ error:重载决策选择隐式删除的复制赋值运算符

时间:2012-07-22 13:38:07

标签: c++ c++11 clang std libc++

我无法使用clang 3.1进行编译的C ++ 11项目。编译器的命令是:

clang++-mp-3.1 -c -std=c++11 -stdlib=libc++ -Wall -g -Iinclude -I/usr/local/include -I/opt/local/include -I/usr/local/include/mongo -o world.o world.cpp

我得到的错误,因为我包含了“-stdlib = libc ++”指令,是这样的:

In file included from world.cpp:1:
/usr/include/c++/v1/string:1952:10: error: overload resolution selected implicitly-deleted copy assignment operator
    __r_ = _STD::move(__str.__r_);
         ^
/usr/include/c++/v1/string:1942:9: note: in instantiation of member function 'std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__move_assign' requested here
        __move_assign(__str, true_type());
        ^
/usr/include/c++/v1/string:1961:5: note: in instantiation of member function 'std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__move_assign' requested here
    __move_assign(__str, integral_constant<bool,
    ^
/usr/include/c++/v1/utility:200:24: note: in instantiation of member function 'std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::operator=' requested here
struct _LIBCPP_VISIBLE pair
                       ^
/usr/include/c++/v1/memory:1941:5: note: copy assignment operator is implicitly deleted because '__compressed_pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>
      >::__rep, std::__1::allocator<char> >' has a user-declared move constructor
    __compressed_pair(__compressed_pair&& __p)
    ^
1 error generated.

有人可以告诉我如何让它发挥作用吗?

我正在尝试编译的文件甚至不必包含任何C ++ 11代码来发生此错误,单独使用“-stdlib = libc ++”指令就足以使其中断。

感谢任何&amp;所有的帮助,    道格。

更新: 嗨 - 代码非常基本,但在尽可能基本的时候,我遇到了这个错误:

Undefined symbols for architecture x86_64:
  "std::__1::cout", referenced from:
      _main in world.o
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::sentry(std::__1::basic_ostream<char, std::__1::char_traits<char> >&)", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<< <std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*) in world.o
  "std::__1::ios_base::clear(unsigned int)", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<< <std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*) in world.o
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::~sentry()", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<< <std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*) in world.o
  "std::__1::ios_base::__set_badbit_and_consider_rethrow()", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<< <std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*) in world.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

为了得到这个错误,我把我的代码剥离回来了:

#include <iostream>
int main( int argc, char *argv[] )
{
  std::cout << "Hi.\n";
}

这使得这看起来像是一个非常根本错误的东西。

当我向编译器取出“-stdlib = libc ++”指令时,我没有收到此错误。

2 个答案:

答案 0 :(得分:1)

也许您应该考虑从llvm本身安装clang。这可以找到here。我不是100%肯定,但也许macports或类似的已经编译了你的版本与你安装的不同的gcc。 llvm下载是根据安装的gcc编译的,并且应该证明ABI兼容。

如果您按照llvm中的说明操作,也可以升级libc ++ .dynlib,但要注意MAC依赖于此的大量编程,因此您必须复制现有的lib(以防万一)。如果你想要前沿,你可能需要深入了解这些变化。我在mac上完成了这个,它非常好,可以很好地编译c ++ 11代码。

要构建libc ++,请参阅here

答案 1 :(得分:0)

有一个类似的问题here

简而言之,当发生这种情况时,是因为其中一个可能的重载被声明为禁止,因此重载决策失败。为了解决这个问题,你应该明确地强制转换为禁止超载不是呼叫的解决方案之一。

请参阅链接问题的已接受答案,以获得非常详细和详尽的解释。