Mac gcc不允许显式调用std :: string ::〜字符串

时间:2016-01-01 23:00:36

标签: c++ macos

strdata->std::string::~string();    

这是我得到的错误:

error: '~' in destructor name should be after nested name specifier
        strdata->std::string::~string();
                              ^

我正在使用cmake项目......我通过brew安装的gcc版本如下:

  

gcc --version       配置为: - prefix = / Library / Developer / CommandLineTools / usr --with-gxx-include-dir = / usr / include / c ++ / 4.2.1       Apple LLVM版本7.0.2(clang-700.1.81)       目标:x86_64-apple-darwin15.2.0       线程模型:posix

我找不到头文件中任何位置定义的~string()。我最终改变它如下,这是有效的。现在可以使用我的用例了。

strdata->std::string::~basic_string();

这个原版似乎是正确的,并且在Linux和CYGWIN的GCC中完美运行。阻止它在mac上运行的问题是什么?模板?还有别的吗?

1 个答案:

答案 0 :(得分:2)

这不是一个完整的答案。出于某种原因,using namespace std;有效,但没有clang失败。考虑这个例子:

#include <new>
#include <type_traits>

namespace foo {

struct A {};
typedef A A_t;

}

int main() {
    std::aligned_storage<sizeof(foo::A)>::type storage;

    foo::A_t* obj = new(&storage) foo::A;

    using namespace foo; // Without this line, clang fails.
    obj->foo::A_t::~A_t();
}

如果没有using namespace foo;行,则clang会给出错误expected the class name after '~' to name a destructor。但有了这条线,它就有效了。将其扩展为std::string

#include <new>
#include <type_traits>
#include <string>

int main() {
    std::aligned_storage<sizeof(std::string)>::type storage;

    std::string* obj = new(&storage) std::string;

    using namespace std; // Without this line, clang fails.
    obj->std::string::~string();
}

它有效。它也适用于较窄的using std::string;

这不能回答为什么 clang失败的问题。我不知道这是clang还是gcc中的错误。但至少存在一种解决方法。

可能值得将此报告为clang中的错误,然后让他们决定是否真的是错误。