我的代码如下所示:
A.H
#include <QString>
namespace foo {
QString bar(QString a);
}
a.cc
#include "a.h"
namespace foo {
QString bar(QString a) { return QString(); }
}
问题出在a.cc中,QString
可能会被视为foo::QString
,从而导致类型编译错误,因为我们没有,也从不想定义{{1} QString
命名空间中的类。
请注意,我的CMakeLists.txt包含以下行:
foo
有什么想法吗?谢谢!
Kuba Ober完全指出了我的问题。
实际上我有一个包含500行代码的头文件。说 a.h 看起来像这样
请注意,foo的大括号未关闭。虽然由于行太多而且编译器(VS2013) 没有 用红色下划线投诉它,我只是没有检测到它。
因为我们在a.cc中包含a.h,即使set(CMAKE_AUTOMOC ON)
find_package(Qt5 COMPONENTS widgets REQUIRED)
set(Qt_LIBRARIES Qt5::Widgets)
target_link_libraries(a Qt_LIBRARIES)
包含在std
命名空间下也是如此。因此,suri
也可能包含在QString
下,导致suri
编译错误。
这是整个故事。谢谢你们,伙计们!
答案 0 :(得分:2)
您显示的代码是正确的。以下表明此类代码没有问题。根据标准,这里使用的QString
没有办法含糊不清:每个使用点都只有一个命名空间可供存在。
// main.cpp
#include <QString>
namespace foo {
QString bar(QString a);
QString bar(QString) { return QString(); }
}
int main() {}
无论您的问题来源是什么,都不是您向我们展示的。至少,您在某处声明了foo::QString
标识符,或在另一个可见的命名空间中声明QString
并使查找不明确。也许你甚至遭受the most vexing parse的困扰,但反过来(你的意思是一个函数,但却得到了一个名为QString
的成员)?
重现类似问题的错误如下:
// main.cpp
#include <QString>
namespace foo {
QString bar(QString a);
int QString(); // BUG: introduce foo::QString as an identifier
// Doesn't compile since QString is ambiguous
QString bar(QString) { return QString(); }
// Compiles OK, indicates presence of the BUG
::QString bar(::QString) { return ::QString(); }
}
int main() {}
您也可能无意中将Qt包含包装到命名空间中,例如:在我的特定平台(OS X 10.9)上,以下代码产生与您看到的完全相同的错误:
#include <cstddef>
#include <cstring>
#include <cstdint>
#include <algorithm>
#include <string>
using namespace std;
class QString;
namespace z {
#include <QString>
}
namespace foo {
QString bar(QString a);
QString bar(QString) { return QString(); }
}
int main() {}
编译器输出:
../test2/main.cpp:15:11: error: incomplete result type 'QString' in function definition
QString bar(QString) { return QString(); }
^
../test2/main.cpp:8:7: note: forward declaration of 'QString'
class QString;
^
../test2/main.cpp:15:22: error: variable has incomplete type 'QString'
QString bar(QString) { return QString(); }
^
../test2/main.cpp:8:7: note: forward declaration of 'QString'
class QString;
^
../test2/main.cpp:15:33: error: invalid use of incomplete type 'QString'
QString bar(QString) { return QString(); }
^~~~~~~~~
../test2/main.cpp:8:7: note: forward declaration of 'QString'
class QString;
^
3 errors generated.