2

所以我得到一个未解决的外部符号错误,我不知道为什么。所有文件都存在于同一个项目中,编译器似乎正在生成所有 obj 文件。我是从模板类派生的,所以我想也许我没有正确声明我的派生方法。我在 VS 2012 中使用 Visual C++ 编译器。

基类.h

template<class T> class BaseClass
{
public:
    BaseClass() {}

    virtual ~BaseClass() {}

    void Foo();
}

基类.cpp

#include "BaseClass.h"

template<class T> void BaseClass<T>::Foo()
{
    cout << "hello";
}

一些类.h

#include "BaseClass.h"

class SomeClass : public BaseClass<long>
{
    public:
       SomeClass() {}

       void DoSomething();
}

SomeClass.cpp

#include "SomeClass.h"

void SomeClass::DoSomething()
{
     Foo(); // link error
     this->Foo(); // also gives link error
     BaseClass<long>::Foo(); // also gives link error
}

因此,由于链接错误,方法 DoSomething() 似乎无法从其基类中调用任何内容。这里有什么明显的地方我做错了吗?

4

2 回答 2

2

创建模板时,编译器会使用给定的模板参数创建一个新类。因此,编译器需要访问方法的实现,并且无法链接。因此您无法将植入分离到.cpp文件中。

如果您真的想将声明与植入分开,那么您应该查看.inl文件。你可以在这里阅读更多关于它们的信息。

于 2013-08-24T23:28:01.997 回答
1

当使用带有模板的类时,您需要在其头文件中提供定义,而不是单独的 .cpp 文件。

于 2013-08-24T23:37:40.653 回答