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上运行的问题是什么?模板?还有别的吗?
答案 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
中的错误,然后让他们决定是否真的是错误。