VS2005 C++:奇怪的链接问题

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类实现的报头。 我知道它应该工作...因为它一直工作。也许我有一些愚蠢的难以发现的错误?..

+0

删除内联关键字 – 2010-04-08 14:00:59

+0

我无法复制此内容。你能告诉我们CHDRGenerator的定义吗? – 2010-04-08 14:05:41

+0

删除“内联”错误消失后。但为什么内联会导致错误? – Irene 2010-04-08 15:23:50

如果从声明和calcWeight的定义中删除“inline”,会发生什么?

+0

嗯......错误消失了。但为什么我不能将calcWeight声明为内联? – Irene 2010-04-08 15:22:15

+1

如果您将方法声明为内联,则它需要与类声明位于同一个文件中,或者在类声明后包含。编译器很难嵌入在外部翻译单元中定义的方法。 – 2010-04-08 16:21:50

+0

标准是复杂的,但实质上,内联意味着每个“翻译单元”(粗略地说,#include中的每个.cc文件都已处理完毕)必须能够看到该内联函数的定义。因此,仅仅包含一个只提供声明但不是定义的.hh文件,就像头文件的典型用法是不够的。内联行为非常像静态,因为它告诉链接器“忽略此功能,此翻译单元以外的任何人都不会调用它,每个使用此功能的人都使用它自己的本地副本”。 – janks 2010-04-08 16:35:25