我有一个带有静态成员数组的模板类,以及一个需要数组大小的方法。
template <int i>
struct Foo {
static int data[];
static int size() {
return sizeof(data) / sizeof(data[0]);
}
};
我想以不同的方式为每个模板专业化初始化数组。
template <>
int Foo<0>::data[] = { 0, 1, 2 };
只要我在一个cpp文件中使用它,它就可以正常工作。但是如何在多个文件中使用它?
如果我将初始化放到标题中,链接将失败,因为:
multiple definition of `Foo<0>::data'
如果我将其放入其中一个cpp文件中,其他文件将不会编译,因为:
invalid application of ‘sizeof’ to incomplete type ‘int []’
我对一个不将数组更改为std :: vector的解决方案感兴趣。
答案 0 :(得分:0)
你可以尝试将它封装在一个未命名的命名空间中,这将提供一个内部链接并绕过`Foo&lt; 0&gt; :: data'的多重定义
namespace{
template <int i>
struct Foo {
static int data[];
static int size() {
return sizeof(data) / sizeof(data[0]);
}
};
}
答案 1 :(得分:0)
如果将结构模板定义保留在标题中,则可以在初始化数据的转换单元中强制执行模板实例化,并在使用时使用extern来防止它,例如:
// imp.cc: initialization and instantiation
template <>
int Foo<0>::data[] = { 0, 1, 2 };
template struct Foo<0>;
// main.cc: extern declaration and usage:
template<> extern int Foo<0>::size ();
... Foo<0>::size () ...
(我用一个小例子和铿锵来测试它。)
答案 2 :(得分:0)
这对我有用:
foo.h中:
#ifndef FOO_H
#define FOO_H
template <int i>
struct Foo {
static int data[];
static int size() {
return sizeof(data) / sizeof(data[0]);
}
};
#endif
富-0.h:
#ifndef FOO_0_H
#define FOO_0_H
#include "Foo.h"
// Provide declarations of the members for 0
template <> int Foo<0>::data[];
template <> int Foo<0>::size();
#endif
富-0.cpp:
#include "Foo-0.h"
// Define the members for 0
template <> int Foo<0>::data[] = {10, 20, 30};
template <> int Foo<0>::size()
{
return sizeof(data) / sizeof(data[0]);
}
main.cpp中:
#include <iostream>
#include "Foo-0.h"
int main()
{
std::cout << Foo<0>::data[0] << std::endl;
std::cout << Foo<0>::size() << std::endl;
};
输出:
10
3