【问题标题】:(2012) Visual C++ LNK2019 Error, Maybe Template Issue? [duplicate](2012) Visual C++ LNK2019 错误,可能是模板问题? [复制]
【发布时间】:2013-08-24 23:17:50
【问题描述】:

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

BaseClass.h

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

    virtual ~BaseClass() {}

    void Foo();
}

BaseClass.cpp

#include "BaseClass.h"

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

SomeClass.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() 方法似乎无法从其基类调用任何内容。有什么明显的地方我做错了吗?

【问题讨论】:

  • 模板方法的通用实现需要在 *.h 或 *.inl 中,这将在 *.h 文件的末尾被 #include 。在 *.cpp 中指定模板类需要的实现。
  • 谢谢这是解决方案。第一次在 C++ 中使用模板,不知道模板定义必须在标题中。

标签: c++ templates visual-c++ visual-studio-2012


【解决方案1】:

当您创建模板时,编译器会使用给定的模板参数创建一个新类。因此,编译器需要能够访问方法的实现,并且不能被链接进来。所以你不能将注入分离到一个.cpp文件中。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-29
      • 2013-01-04
      • 1970-01-01
      • 1970-01-01
      • 2013-06-14
      • 2017-02-08
      • 2015-03-18
      相关资源
      最近更新 更多