首页 > 解决方案 > 静态库中具有静态成员的类的显式模板实例化

问题描述

我要问的问题与我正在研究的具有持久性支持的 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
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)
#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
#ifndef STATICTEST_TEXAMPLECLASS_H
#define STATICTEST_TEXAMPLECLASS_H

template< class T>
class TExampleClass {
public:
    T obj;
};


#endif //STATICTEST_TEXAMPLECLASS_H
#include "TExampleClass.h"


#include "TRestoreClass.h"
template class TRestoreClass<TExampleClass<int>>;
int main() {
    return 0;
}

标签: c++static-membersstatic-initialization

解决方案


推荐阅读