方法中使用的静态模板成员数组sizeof

时间:2015-05-21 15:44:13

标签: c++ arrays templates initialization

我有一个带有静态成员数组的模板类,以及一个需要数组大小的方法。

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的解决方案感兴趣。

3 个答案:

答案 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