C++ sizeof 不适用于模板

标签 c++ templates

<分区>

Possible Duplicate:
C2070 - illegal sizeof operand

为什么下面代码的模板化版本不能编译,而当(未使用的)模板被移除时,完全相同的代码会编译?


不编译:

template <typename T>
class Foo {
public:
    static double const vals[];
    int run ();
};

template <typename T>
double const Foo<T>::vals[] = { 1, 2,3 };

template <typename T>
inline
int Foo<T>::run () {
    return sizeof(vals); // error C2070: 'const double []': illegal sizeof operand
}

编译:

class Foo {
public:
    static double const vals[];
    int run ();
};

double const Foo::vals[] = { 1, 2,3 };

inline
int Foo::run () {
    return sizeof(vals);
}

最佳答案

因为 Visual Studio 坏了。请参阅:http://connect.microsoft.com/VisualStudio/feedback/details/759407/can-not-get-size-of-static-array-defined-in-class-template

一个可能的(未经测试的)解决方法是使用这样的东西:

private:
template<typename T, int size>
int get_array_length(T(&)[size]){return size;}

然后使用:

int Foo::run() {
    return get_array_length(vals) * sizeof(double);
}

关于C++ sizeof 不适用于模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13146070/

相关文章:

c++ - Windows 8 SDK 库位置

c++ - IME - 如何处理按键

c++ - 即使模板函数在任何地方都没有调用,static_assert 也无法编译

c++ - 使用 stringstream 将字符串转换为数字

c++ - 通过 D2XX 库或 OPENCV 捕获相机(USB)

c++ - 在使用 boost::assign::list_of 时声明时不能被非常量表达式初始化

c++ - 创建模板内部 lambda 函数?

c++ - 作为类参数的模板对象在编译前给出错误

c++ - 我的基于可变参数模板的包装函数有什么问题?

c++ - Qt中如何实现OpenSSL?