为什么将外部模板重新声明为 "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
你可以做两件事中的一件。
使pool
成为普通变量。
extern PoolType<int> pool;
// in some other file
PoolType<int> pool;
// in main
pool.do_something();
将 pool
设为变量模板。
template <class T> extern PoolType<T> pool;
// in some other file
template <> PoolType<int> pool<int>;
// in main
pool<int>.do_something();
所以我试图在翻译单元之间共享一个模板化的全局变量。
对于具有一个 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
你可以做两件事中的一件。
使
pool
成为普通变量。extern PoolType<int> pool; // in some other file PoolType<int> pool; // in main pool.do_something();
将
pool
设为变量模板。template <class T> extern PoolType<T> pool; // in some other file template <> PoolType<int> pool<int>; // in main pool<int>.do_something();