为什么编译器没有为我未实例化的模板类的静态成员变量生成代码?

时间:2013-03-08 00:07:58

标签: c++ templates static-initialization

这个问题很难说,主要是因为术语类实例化与模板实例化。我有一个充满静态函数和成员的模板类。该模板的每个特化都需要在首次使用之前完成一些初始化。

我的初步计划是给模板类一个静态initializer成员,它将在动态初始化过程中初始化模板类的静态成员。

但是,这不起作用。除非我在initializer类中显式调用代码,否则编译器不会为其生成任何代码或存储。

例如:

template<typename Tag>
class WorkerPool
{
    struct WorkerInitializer
    {
        void foo() { }
        WorkerInitializer() { WorkerPool<Tag>::start(); }
    };
    friend struct WorkerInitializer;
    static WorkerInitializer _initializer;

    static void start() { std::cout << "Started" << std::endl; }

public:
    static void async() { std::cout << "Async" << std::endl; }
};

template<typename T> typename WorkerPool<T>::WorkerInitializer 
WorkerPool<T>::_initializer;


struct GenericWorker { };
int main()
{
    WorkerPool<GenericWorker>::async();
}

输出只是'异步'。

但是,如果我更改它以便调用WorkerPool<T>::async()调用_initializer.foo(),则初始化程序会按照我的预期进行编译和正确构造。

为什么编译器拒绝为我的静态成员生成代码?

我已经使用Visual Studio 2010/2012,gcc和clang进行了测试,并且都生成了相同的结果;我的静态成员没有构建。这让我觉得标准需要这种行为,但我很难理解为什么会这样。

0 个答案:

没有答案