静态类成员的顺序

时间:2016-02-18 18:35:00

标签: c++ c++11

今天我发现静态班级成员的顺序确实很重要。 以下是示例:

template <typename T>
struct SizeOf
{
    template <typename U>
    static auto Test() { return U{}; }

    static const size_t value = sizeof(Test<T>());
};

std::cout << SizeOf<double>::value << std::endl; // ok!

但是,这种情况给了我编译错误:

template <typename T>
struct SizeOf
{
    static const size_t value = sizeof(Test<T>());

    template <typename U>
    static auto Test() { return U{}; }
};

std::cout << SizeOf<double>::value << std::endl; // error: "Test: undeclared identifier"

这是否意味着,静态成员的处理方式与全局变量/函数完全相同,以后的静态成员是不会看到的?

2 个答案:

答案 0 :(得分:3)

这与编译器已知的名称顺序有关。当你有

template <typename T>
struct SizeOf
{
    static const size_t value = sizeof(Test<T>());

    template <typename U>
    static auto Test() { return U{}; }
};

编译器从未见过Test中的static const size_t value = sizeof(Test<T>());所以它会抛出

  

测试:未声明的标识符

因为它不知道它是什么。当你拥有它时,编译器的另一种方式知道Test是什么,所以它编译得很好。

答案 1 :(得分:-1)

您无法引用尚未声明的内容。当编译器遇到Test<T>时,他应该如何有意义地推断出你的实际意思?