c++ - 是否有可能继承自专门针对自己的模板类 C++

标签 c++ linker-errors visual-studio-2017

<分区>

假设我们有基类 Table

template <typename T>
class Table
{
public:
  Table();
  virtual ~Table() = default;
private:
// get all column names as list
virtual std::list<std::string> getAllColumnsImpl();
};

我想从基类继承 TestTable 类并覆盖方法 getAllColumnsImpl:

class TestTable :
public Table<TestTable>
{
public:
 TestTable();
 virtual ~TestTable() = default;

std::string Description;
int Count;


private:
// get all column names as list
std::list<std::string> getAllColumnsImpl() override;
};

一般情况下可以吗?

例如,我有如下链接器错误:

error LNK2019: unresolved external symbol "public: __cdecl Table<class TestTable>::Table<class TestTable>(void)" (??0?$Table@VTestTable@@@@QEAA@XZ) referenced in function "public: __cdecl TestTable::TestTable(void)" (??0TestTable@@QEAA@XZ)

最佳答案

你可以做到,它叫做 CRTP - Curiously Recurring Template Parameter。它非常方便,有许多博客和资源解释了它的用途。

你得到的错误是因为你需要在模板的头文件中包含模板的函数体。

每个 cpp 文件都被编译成一个单独的目标文件,模板在每个 cpp 文件的基础上解析。当您将模板代码放入 cpp 文件时,它只是“template < T >”,编译器不知道 T 是什么,因此不会生成任何代码(除非它是从同一个 cpp 文件请求的,具有实际类型和不是 T)。

然而,您的其他 cpp 文件知道它需要一个“模板 < TestTable >”,但它无法访问使该工作正常工作的代码,因为它卡在另一个 cpp 文件中,它只知道通用“模板”。这两个 cpp 文件都无法生成丢失的代码,因此您会收到链接器错误。将所有模板代码放在头文件中可以解决这个问题。

关于c++ - 是否有可能继承自专门针对自己的模板类 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44309219/

相关文章:

visual-studio - 无法使用产品 key 激活 Visual Studio

c++ - GCC 8.1.0/MinGW64 编译的 OpenMP 程序崩溃寻找 cygwin.s?

docker - 目标依赖图中存在涉及目标 "DockerBuildServiceReferences"的循环依赖

c++ - 计数位数 : How does this line work ? n=n&(n-1);

c - 使错误 undefined reference

c++ - 是否可以使用不同 ABI 的外部库构建应用程序

c++ - LNK1201 在 Visual C++ 2003 上

uwp - 通过App Installer安装UWP应用程序出现网络错误,依赖包丢失

c++ - STL vector 算子数据

c++ - 如何将 Arduino 与 Microsoft Visual Studio 一起使用(由于 #include_next 预编译器问题)