VS2005 C++:奇怪的链接问题
我的Visual Studio 2005 C++项目中有一些奇怪的链接问题。 与往常一样,我在头文件中声明类并在cpp中定义它的方法。 A将所有这些文件包含在我的项目中。 而我仍然有无法解析的外部符号calcWeight。看起来如果我真的在我的主要功能中使用这个类。 calcWeight()在父类CHDRGenerator中声明为虚拟 如果我在cpp中评论代码并在类体中定义calcWeight,它可以正常工作。但我真的不喜欢这个魔法。 有人可以帮忙吗?VS2005 C++:奇怪的链接问题
这里是一个代码的一部分:
//mann-pickard.h
#include "stdafx.h"
#include "simple.h"
class CHDRGenerator_Mann_Pickard : public CHDRGenerator
{
public:
/// @name Constructors
/// @{
/// @brief a constructor using prepared imaged sequence
CHDRGenerator_Mann_Pickard(CSimpleImageFile * imSeq, int seqL) : CHDRGenerator(imSeq, seqL)
{
}
/// @brief a constructor using filenames
CHDRGenerator_Mann_Pickard(std::string * filenames, int seqL) : CHDRGenerator(filenames, seqL)
{
}
/// @brief a constructor, CFileNameSequence object parameter
CHDRGenerator_Mann_Pickard(CFileNameSequence & const fileseq) : CHDRGenerator(fileseq)
{
}
/// @}
private:
inline double calcWeight(double val);
};
//mann-pickard.cpp
#include "mann-pickard.h"
//=======================Class CHDRGenerator_Mann_Pickard methods=====================//
//...
inline double CHDRGenerator_Mann_Pickard::calcWeight(double val)
{
const double gamma = 2.2f;
return gamma * pow(val, gamma - 1);
}
//=====================End of Class CHDRGenerator_Mann_Pickard methods=================//
“simple.h” 是具有CHDRGenerator类实现的报头。 我知道它应该工作...因为它一直工作。也许我有一些愚蠢的难以发现的错误?..
如果从声明和calcWeight的定义中删除“inline”,会发生什么?
嗯......错误消失了。但为什么我不能将calcWeight声明为内联? – Irene 2010-04-08 15:22:15
如果您将方法声明为内联,则它需要与类声明位于同一个文件中,或者在类声明后包含。编译器很难嵌入在外部翻译单元中定义的方法。 – 2010-04-08 16:21:50
标准是复杂的,但实质上,内联意味着每个“翻译单元”(粗略地说,#include中的每个.cc文件都已处理完毕)必须能够看到该内联函数的定义。因此,仅仅包含一个只提供声明但不是定义的.hh文件,就像头文件的典型用法是不够的。内联行为非常像静态,因为它告诉链接器“忽略此功能,此翻译单元以外的任何人都不会调用它,每个使用此功能的人都使用它自己的本地副本”。 – janks 2010-04-08 16:35:25
删除内联关键字 – 2010-04-08 14:00:59
我无法复制此内容。你能告诉我们CHDRGenerator的定义吗? – 2010-04-08 14:05:41
删除“内联”错误消失后。但为什么内联会导致错误? – Irene 2010-04-08 15:23:50