使用std :: unique_ptr模板的奇怪链接器错误

时间:2012-11-15 17:14:47

标签: c++ templates linker-errors

  

可能重复:
  Why can templates only be implemented in the header file?

我一直试图解决这个问题2天了。

这是我得到的链接器错误:

main.cpp:17: undefined reference to `std::unique_ptr<Foo, std::default_delete<Foo> > Bar::make_unique_pointer<Foo>()'

下面的代码演示了我遇到的问题。

Bar.h

class Bar {
public: 
    template <class T>
    std::unique_ptr<T> make_unique_pointer();
};

Bar.cpp

#include "Bar.h"

template <class T>
std::unique_ptr<T> Bar::make_unique_pointer() {
    return std::unique_ptr<T>(new T());
}

的main.cpp

#include "Bar.h"

struct Foo {};

int main() {
    Bar bar;
    auto p = bar.make_unique_pointer<Foo>();  
    return 0;
}

但是,如果我将函数定义为内联函数,则可以正常工作

class Bar {
public:
    template <class T>
    std::unique_ptr<T> make_unique_pointer() {
        return std::unique_ptr<T>(new T());
    }
};

或者,如果我将定义放在main.cpp中或甚至放在Bar.h中,它将编译正常。

当它们位于单独的文件中时,我只会收到链接器错误:/

1 个答案:

答案 0 :(得分:2)

功能模板必须在创建它们的同一文件中实现。 See this answer for why