我正在尝试实现一个继承链,其中在基类型上声明的方法按值返回派生类型 。例如,我有一个基类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文件中)并使链接器错误消失?