当我定义一个方法,该方法在头文件中使用std::string
并使用" Add Definition to xxx.cpp
"在Qt Creator中,它在.cpp中创建一个定义,其中所有std :: string参数都使用类型std::___LIBCPP_ABI_VERSION::string
。
通常我只是删除" ___LIBCPP_ABI_VERSION::
",但这是什么意思?为什么会发生这种情况?如何让qt创建者只是按预期使用std :: string?
这是在OSX中。我应该在我的.pro文件中添加:
LIBS += -stdlib=libc++
LIBS += -lstdc++
为了使用C ++ 11。我猜这与标准库的使用有关,但我不确切地知道问题是什么。
答案 0 :(得分:2)
这是因为你可以"重定向"类型和Qt Creator以不同的方式解析这种重定向,也许并不总是以最想要的方式。
假设您在Foo
中有Namespace1
种Bar
,Namespace2
中有Bar
。现在,您可以Namespace1
Namespace1::Bar
种类#pragma once
namespace Namespace2 {
struct Bar
{
};
}
,以便能够通过#pragma once
#include "bar.h"
namespace Namespace1
{
using MyBar = Namespace2::Bar; // i.e. Namespace1::MyBar
using Namespace2::Bar; // i.e. Namespace1::Bar
class Foo
{
public:
Foo(const Bar &bar);
Foo(const MyBar &bar);
};
}
访问它。
bar.h
Namespace1
foo.h中
using
在foo标头中,两个参数都是cpp
中的类型,但它们以不同的方式重定向(请参阅#include "foo.h"
namespace Namespace1 {
Foo::Foo(const Namespace2::Bar &bar)
{
}
Foo::Foo(const MyBar &bar)
{
}
}
语句)。对于编译器来说它是完全相同的,但是Qt Creator将类型扩展为std::string
文件。
Foo.cpp中
std::___LIBCPP_ABI_VERSION::string
在OS X上的C ++标准库中,std::string
未直接实现,而是重定向到{{1}},然后{{1}}实现该功能。作为用户,您根本不应该看到它,因为它是一个实现细节,将来可能会发生变化。你一直在{{1}}工作。您可以并且始终应该使用标头中使用的原始类型替换类型。