VS2005C++:奇怪的链接问题 我在Visual Studio 2005 C++项目中有一些奇怪的链接问题。 和往常一样,我在头中声明类,并在cpp中定义它的方法。A我的项目中包含了所有这些文件。 我还有一个未解析的外部符号calcWeight。如果我在主函数中实际使用这个类,就会出现这种情况。 calcWeight在父类CHDRGenerator中声明为虚拟 如果我在cpp中注释代码,并在类主体中定义calcWeight,它就可以正常工作。但我真的不喜欢这种魔术。 有人能帮忙吗

VS2005C++:奇怪的链接问题 我在Visual Studio 2005 C++项目中有一些奇怪的链接问题。 和往常一样,我在头中声明类,并在cpp中定义它的方法。A我的项目中包含了所有这些文件。 我还有一个未解析的外部符号calcWeight。如果我在主函数中实际使用这个类,就会出现这种情况。 calcWeight在父类CHDRGenerator中声明为虚拟 如果我在cpp中注释代码,并在类主体中定义calcWeight,它就可以正常工作。但我真的不喜欢这种魔术。 有人能帮忙吗,c++,visual-studio-2005,linker,C++,Visual Studio 2005,Linker,以下是代码的一部分: //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.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=================//
h是具有CHDRGenerator类实现的头。
我知道它应该会起作用…就像它一直起作用一样。也许我有一些愚蠢的难以发现的错误?。

如果将内联从calcWeight的声明和定义中删除,会发生什么?

我无法复制这一点。你能告诉我们CHDRGenerator的定义吗?在删除内联错误之后。但是为什么内联会导致错误呢?嗯。。。错误已经过去了。但是为什么我不能将calcWeight声明为inline呢?如果将方法声明为inline,那么它需要与类声明位于同一个文件中,或者包含在类声明之后。编译器很难在外部翻译单元中定义内联方法。standardese很复杂,但本质上,内联意味着每个翻译单元,粗略地说,包括处理后的每个.cc文件,都必须能够看到内联函数的定义。因此,仅仅包含一个只提供声明而不提供定义的.hh文件(如头文件的典型用法)是不够的。内联的行为非常类似于静态,从某种意义上说,它告诉链接器忽略此函数,来自此翻译单元之外的任何人都不会调用它,使用此函数的每个人都使用其自己的本地副本。