2

更新 2:找到导致此问题的前向声明错误

更新使用 Visual Studio 2010 库存编译器编译,启用了 c++0x。

我有一个具有奇怪行为的成员函数的类。

当我在 cpp 文件中定义方法时,链接器会因“未解析的外部符号”错误而崩溃。当我将定义移动到标题时,它编译得很好。

1)这不是模板方法 2)cpp 文件肯定正在编译 3)我很难过

有什么想法吗?

头文件

// THIS IS THE ERROR HERE: I forward declare TPA as a class, when it is actually a struct
class TollingPathAttributes; // forward declare the TollingPathAttributes struct as a class (doh!)

class TollingPathAttributesOutput
{
public:
    TollingPathAttributesOutput(HighwayCommand* command);
    ~TollingPathAttributesOutput();

    void foo();
    void AddPathAttributes(boost::shared_ptr<TollingPathAttributes> attributes);

protected:
    string                                      m_outputFilename;
    vector<shared_ptr<TollingPathAttributes>>   m_data;
    queuing_mutex                               m_dataMutex;
};

.cpp 文件

void TollingPathAttributesOutput::foo() {}

void TollingPathAttributesOutput::AddPathAttributes(boost::shared_ptr<TollingPathAttributes> attributes)
{
    queuing_mutex::scoped_lock lock(m_dataMutex);
    m_data.push_back(attributes);
}

调用调用

m_output->foo();  // compiles and links no problem
boost::shared_ptr<TollingPathAttributes> attr = 
    boost::make_shared<TollingPathAttributes>(origin, dest, UNTOLLED_OPTION, vector<int>(), 0.0, 0.0);
m_output->AddPathAttributes(attr); // compiles fine, but only links correctly if I move the definition to the header

链接错误

1>OtCustomZenith_logic.lib(TollingPathAttributesRecorder.obj) : error LNK2019: unresolved external symbol "public: void __thiscall TollingPathAttributesOutput::AddPathAttributes(class boost::shared_ptr<class TollingPathAttributes>)" (?AddPathAttributes@TollingPathAttributesOutput@@QAEXV?$shared_ptr@VTollingPathAttributes@@@boost@@@Z) referenced in function "public: virtual void __thiscall TollingPathAttributesRecorder::Record(class TolledPath &,class boost::shared_ptr<class Path>,int)" (?Record@TollingPathAttributesRecorder@@UAEXAAVTolledPath@@V?$shared_ptr@VPath@@@boost@@H@Z)     
1>..\..\..\OT\OtCustomZenith_test.exe : fatal error LNK1120: 1 unresolved externals
4

2 回答 2

3

感谢每一位试图提供帮助的人——不幸的是,这个错误发生在键盘后面大约 1 英尺处。这里的问题归结为使用前向声明来加快我的编译时间。因为我错误地将 TollingPathAttributes 的类型声明为类而不是结构。

这意味着标头的定义与 cpp 中的定义略有不同,因为我实际上在 cpp 文件中包含了 TollingPathAttributes 的完整定义。使这个问题感到困惑的是,我收到的错误消息不是我期望收到的 - 正如@MarkRansom 所说,通常如果 cpp 和标头之间不匹配,那将是编译错误而不是链接错误所以我必须得出结论:

1) 编译器只是简单地推进了不正确的基于“类”(而不是“结构”)的定义,即使它一旦拥有完整的定义就知道得更好。导致一个 lib 文件的签名几乎但不是链接器正在寻找的。

2)其他一些奇怪的东西

于 2012-04-15T22:37:07.623 回答
0

从错误消息来看,您的 .cpp 文件正在编译为 .lib。是否有可能存在两个 .lib 副本,一个在每次编译时更新,另一个链接到您的 .exe?

于 2012-04-12T21:29:47.790 回答