为什么将外部模板重新声明为 "different kind of entity"?

Why is an external template redeclared as a "different kind of entity"?

所以我试图在翻译单元之间共享一个模板化的全局变量。

对于具有一个 header declaring/implementing 模板和第二个 C++ 文件的函数,有一种常见的策略可以执行此操作,该文件显式枚举所有参数以实际为链接器生成代码。

原版长这样

template<typename T>
struct PoolType
{
    void do_something()
    {

    }
};

template <class T>  PoolType<T> pool;

int main ()
{
    pool<int>.do_something(); 
    pool<float>.do_something();// can make other types 
}

将这种方法扩展到模板化结构时,我遇到了一些奇怪的错误。有谁知道错误的含义以及“声明”了哪种实体?

template<typename T>
struct PoolType
{
    void do_something()
    {

    }
};

template <class T>  extern PoolType<int> pool; //Suppoedly can live in another TU
//In some other file
PoolType<int> pool;

// template <class T>  PoolType<int> pool; //works fine but limited to one TU
int main ()
{
    pool<int>.do_something(); 
}

gcc

 error: 'PoolType<int> pool' redeclared as different kind of entity

铿锵

error: redefinition of 'pool' as different kind of symbol

godbolt

你可以做两件事中的一件。

  1. 使pool成为普通变量。

    extern PoolType<int> pool;
    // in some other file
    PoolType<int> pool;
    // in main
    pool.do_something();
    
  2. pool 设为变量模板。

    template <class T> extern PoolType<T> pool;
    // in some other file
    template <> PoolType<int> pool<int>;
    // in main
    pool<int>.do_something();