QString和一些Qt类被识别为不完整类型

时间:2016-04-25 13:41:48

标签: c++ qt

我的代码如下所示:

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 看起来像这样

a.h

请注意,foo的大括号未关闭。虽然由于行太多而且编译器(VS2013) 没有 用红色下划线投诉它,我只是没有检测到它。

然后在a.cc中,我们有这样的代码 a.cc

因为我们在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编译错误。

这是整个故事。谢谢你们,伙计们!

1 个答案:

答案 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.