首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >QString和一些Qt类被识别为不完全类型。

QString和一些Qt类被识别为不完全类型。
EN

Stack Overflow用户
提问于 2016-04-25 13:41:48
回答 1查看 3.3K关注 0票数 0

我的代码如下所示:

a.h

代码语言:javascript
代码运行次数:0
运行
复制
#include <QString>

namespace foo {
  QString bar(QString a);
}

a.cc

代码语言:javascript
代码运行次数:0
运行
复制
#include "a.h"

namespace foo {
  QString bar(QString a) { return QString(); } 
}

问题是在a.cc中,QString可能被视为foo::QString,从而导致不完整的类型编译错误,因为我们不想也永远不想在foo命名空间中定义QString类。

请注意,我有包含以下行的CMakeLists.txt:

代码语言:javascript
代码运行次数:0
运行
复制
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编译错误。

这就是整个故事。谢谢各位!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-25 14:08:33

你显示的代码是正确的。下面演示了这样的代码没有问题。根据标准,这里使用的QString不可能是模棱两可的:在存在标识符的每个使用点上,只有一个名称空间可见。

代码语言:javascript
代码运行次数:0
运行
复制
// 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的成员)?

再现类似问题的错误如下:

代码语言:javascript
代码运行次数:0
运行
复制
// 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)上,以下代码会产生与您看到的完全相同的错误:

代码语言:javascript
代码运行次数:0
运行
复制
#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() {}

编译器输出:

代码语言:javascript
代码运行次数:0
运行
复制
../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.
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36842344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档