c++ - 静态库中具有静态成员的类的显式模板实例化
问题描述
我要问的问题与我正在研究的具有持久性支持的 C++ 库有关。但是,我设法在一个简单的示例中简化了我的问题,因此我不会详细介绍我的原始场景,除非有人对此感兴趣。
在这个恢复的示例中,我想确保显式实例化(src/TExampleClass.cpp):
template class TRestoreClass<TExampleClass<int>>;
将初始化变量(include/TRestoreClass.h):
TRestoreClass<TExampleClass<int>> TRestoreClass<TExampleClass<int>>::pRestore;
目前,当我运行代码时,一切顺利,我的输出是:
/pathToExecutable/StaticTest
TRestoreClass<TExampleClass<int> >::TRestoreClass() [T = TExampleClass<int>]
Process finished with exit code 0
但是,如果我更改 CMakeLists.txt 以生成 STATIC 库,我的输出是:
/pathToExecutable/StaticTest
Process finished with exit code 0
并且似乎没有发生实例化。
因为我不想依靠运气来知道这个实例化是否会发生,所以我决定在这里发布这个问题。如果这个问题的格式不充分,我提前道歉,我只是想确保所有信息都可以在这里获得。
编辑:虽然这个问题确实很相似,但对我来说仍然不清楚: - 如果我使用共享库,为什么它会起作用?这有保证吗?- 我是否应该诉诸在头文件上编写显式实例化,据我所知,这不是一个好习惯?因为这是我读过的那个问题的答案中与编译器无关的解决方案。
感谢您的关注,在这里您可以找到详细说明问题的信息:
- 目录和文件结构:
├── include
| ├── TRestoreClass.h
| └── TExampleClass.h
├── src
| ├── TExampleClass.h
└── main.cpp
└── CMakeLists.txt
- CMakeLists.txt:
cmake_minimum_required(VERSION 3.9)
project(StaticTest)
set(CMAKE_CXX_STANDARD 11)
add_library(libTest SHARED
src/TExampleClass.cpp
)
target_include_directories(libTest PUBLIC include)
add_executable(StaticTest main.cpp)
target_link_libraries(StaticTest libTest)
- 包括/TRestoreClass.h:
#ifndef STATICTEST_TRESTORECLASS_H
#define STATICTEST_TRESTORECLASS_H
#include <iostream>
template<class T>
class TRestoreClass {
public:
TRestoreClass(){
std::cout<<__PRETTY_FUNCTION__<<std::endl;
/**IMPORTANT STUFF SHOULD HAPPEN HERE**/
}
private:
static TRestoreClass<T> pRestore;
};
template<class T>
TRestoreClass<T> TRestoreClass<T>::pRestore;
#endif //STATICTEST_TRESTORECLASS_H
- 包括/TExampleClass.h:
#ifndef STATICTEST_TEXAMPLECLASS_H
#define STATICTEST_TEXAMPLECLASS_H
template< class T>
class TExampleClass {
public:
T obj;
};
#endif //STATICTEST_TEXAMPLECLASS_H
- src/TExampleClass.cpp:
#include "TExampleClass.h"
#include "TRestoreClass.h"
template class TRestoreClass<TExampleClass<int>>;
- 主.cpp:
int main() {
return 0;
}
解决方案
推荐阅读
- javascript - 如何在原始数据中搜索匹配数据?
- c# - 使用 ASP.NET MVC 成功登录 AngularJS 后导航到所需页面
- apache - Ubuntu Server 16.04 错误 60:SSL 证书问题
- google-apps-script - 响应式 ModalDialog/ModelessDialog 谷歌脚本
- java - 模糊联系服务的 Java JUnit 问题
- javascript - 如何在 JavaScript 数组中添加换行符?
- node.js - 从 Firebase VerifyToken 获取用户显示名称(第 2 部分)
- html - 是否可以在两个不同的部分使用 flexbox 顺序?
- powershell - 在 PowerShell 中运行外部二进制文件会在新的 cmd 窗口中打开进程,但仅在不使用相对路径时
- mysql - Sequelize将一张表的两列连接到另一张表的同一列