我的代码如下所示:
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
,从而导致不完整的类型编译错误,因为我们不想也永远不想在foo
命名空间中定义QString
类。
请注意,我有包含以下行的CMakeLists.txt:
set(CMAKE_AUTOMOC ON)
find_package(Qt5 COMPONENTS widgets REQUIRED)
set(Qt_LIBRARIES Qt5::Widgets)
target_link_libraries(a Qt_LIBRARIES)
有什么想法吗?谢谢!
库巴·奥伯准确地指出了我的问题。
实际上,我有一个包含500行代码的头文件。假设a.h是这样的
注意,foo的大括号没有关闭。虽然由于行太多,编译器(VS2013) 没有用红色下划线抱怨,但我只是没有检测到。
在a.cc中,我们有这样的代码
因为我们在a.cc中包含了a.h,甚至std
也被包装在suri
命名空间下,因此QString
也可能被包装在suri
下,从而导致recognized as incomplete type
编译错误。
这就是整个故事。谢谢各位!
发布于 2016-04-25 14:08:33
你显示的代码是正确的。下面演示了这样的代码没有问题。根据标准,这里使用的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 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.
https://stackoverflow.com/questions/36842344
复制相似问题