【问题标题】:Error: method was not declared in this scope (but it is included)错误:方法未在此范围内声明(但已包含在内)
【发布时间】:2011-09-11 00:18:18
【问题描述】:

我有两个文件夹 f1 和 f2,它们位于同一级别(父文件夹具有相同的文件夹)。在 f1 我有我的项目的源代码,在 f2 我有单元测试。

当我尝试将项目中的文件包含到单元测试类中时,会出现问题。我只是得到这个:

natty:/tmp/test/f2$ qmake-qt4 .
natty:/tmp/test/f2$ make
g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I/usr/include/qt4/QtTest -I../f1 -I. -o main.o main.cpp
g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I/usr/include/qt4/QtTest -I../f1 -I. -o tcommon.o tcommon.cpp
tcommon.cpp: In member function ‘void tcommon::tCalculateMD5_str()’:
tcommon.cpp:21:50: error: ‘CalculateMD5’ was not declared in this scope
tcommon.cpp: In member function ‘void tcommon::tCalculateMD5_uint()’:
tcommon.cpp:43:50: error: ‘CalculateMD5’ was not declared in this scope
make: *** [tcommon.o] Error 1

发生了什么事?相关文件中的代码是,test/f2/tcommon.cpp:

#include "tcommon.h"
#include <common.h>

// ...

void tcommon::tCalculateMD5_str()
{
    QFETCH(QString, string);
    QFETCH(QString, result);

    // THIS IS LINE 21 <-----------------------------------------------
    QCOMPARE(CalculateMD5(string), result);
}
// ...

这里是来自test/f1/common.hcommon.h(包含找到就好了):

#ifndef COMMON_H
#define COMMON_H

#include <QtCore>

QString CalculateMD5(uint number);
QString CalculateMD5(QString str);

#endif // COMMON_H

这是无法编译的项目 (3 kb): http://www.xx77abs.com/test2.rar

【问题讨论】:

  • (a) 是的,那是我的错误,错误的话:P (b) 好的。 (c) 你能告诉我怎么做,或者给我一个链接或其他东西,以便我可以进一步研究? (d) 好吧,你可以解压它,你会得到一个不起作用的例子……我认为这比在我的问题中复制/粘贴代码要好。
  • @xx77aBs:我刚刚解决了你的问题。您的问题确实令人费解,并且描述在一定程度上被误导了。但是,您确实遇到了一个真实、合法且可以理解的问题。我希望你能学到很多关于 C 的很酷的东西 :)
  • @xx77aBs:创建a short, reproducible testcase 是编程问题的适当机制。 99.99999999% 的代码与手头的问题完全无关。
  • @Tomalak:我认为你不太公平。我怀疑你是否真的看过代码。它是 79 行(稀疏)代码。它基本上是一个经过调整的 hello world 控制台应用程序。 OP认为文件夹结构很重要,这一事实要求他建立档案,而不是发布 79 行。
  • @sehe:不,我根本没看。 SO问题应该是独立的;将其中的一部分托管在其他地方是不合适的,并且容易导致链接失效。

标签: c++ unit-testing qt compiler-errors subdirectory


【解决方案1】:

您的问题是您在 f2/tcommon.h 中复制了 f1/common.h 的标头保护。

将这些更改为(在 tcommon.h 中):

#ifndef TCOMMON_H
#define TCOMMON_H

//...

#endif // TCOMMON_H

并且问题已解决,程序构建并且您可以运行它。回复:fixed.zip(见source of this answer

【讨论】:

  • 如果这会导致链接器错误,那一定是一个非常奇怪的代码布局。头文件中的函数定义,以及不同头文件中相同函数的声明?
  • @Tomalak:不,只是两个不相关的标头具有相同的标头保护。你知道这是怎么回事:包含的标题首先获胜
  • 哦,顺便说一句,这不是链接器错误;未声明,未定义或未解决
  • 啊,这一切都不同了。因此,问题中给出的唯一条具体信息完全是错误的。
  • @sehe 非常感谢!我一定已经监督了这一点(该死的取代了所有深夜编码:P)。 (==致所有人==)感谢您的cmets。我会尝试使用你所有的建议:)
猜你喜欢
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-10
  • 2015-06-23
  • 2010-10-02
相关资源
最近更新 更多