你如何正确定义一个静态继承的方法?

时间:2017-08-25 09:06:29

标签: c++ templates inheritance crtp

我正在尝试实现一个继承链,其中在基类型上声明的方法按值返回派生类型 。例如,我有一个基类Base,其方法为func()。在派生类Derived上,我希望func()按值返回Derived的实例。

为此,我尝试使用"static polymorphism":基类通过模板参数获取派生类,然后使该方法返回模板类型。这是我的头文件:

#pragma once

template<typename Derived>
class Base {
  public:
    Derived func() const;
};

class DerivedA : public Base<DerivedA> {
  public:
    DerivedA() : Base() {}
    DerivedA(const Base<DerivedA>& other) : Base(other) {}
};

到目前为止一切顺利。我在cpp文件中定义了函数:

#include <iostream>

template<typename Derived>
Derived Base<Derived>::func() const {
    std::cout << "Calling func" << std::endl;
    return Derived(*this);
}

然后我在主函数中调用它:

#include "demo.h"

int main() {
    DerivedA a;
    a.func();
    return 0;
}

不幸的是,编译此代码会导致以下链接器错误。

main.cpp.o: In function `main': main.cpp:6: undefined reference to `Base<DerivedA>::func() const'
collect2: error: ld returned 1 exit status

这是我的CMakeLists.txt:

cmake_minimum_required(VERSION 3.7)
project(demo)

set(CMAKE_CXX_STANDARD 11)

set(SOURCE_FILES main.cpp demo.cpp demo.h)
add_executable(demo ${SOURCE_FILES})

奇怪的是,如果我将定义移到头文件中,代码会在没有链接器错误的情况下进行编译。

如何正确定义函数(理想情况下在cpp文件中)并使链接器错误消失?

0 个答案:

没有答案