有没有可能继承自Template class C++ specialized on himself
Is it possible inherit from Template class C++ specialized on himself
假设我们有基数 class 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 class 并从基础 class:
覆盖方法 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 文件知道它需要一个 "template < TestTable >",但它无法访问使它工作的代码,因为它卡在另一个 cpp 文件中,它只知道通用 "template < T >"。这两个 cpp 文件都无法生成丢失的代码,因此您会收到链接器错误。将所有模板代码放在头文件中可以解决问题。
假设我们有基数 class 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 class 并从基础 class:
覆盖方法 getAllColumnsImplclass 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 文件知道它需要一个 "template < TestTable >",但它无法访问使它工作的代码,因为它卡在另一个 cpp 文件中,它只知道通用 "template < T >"。这两个 cpp 文件都无法生成丢失的代码,因此您会收到链接器错误。将所有模板代码放在头文件中可以解决问题。