今天我发现静态班级成员的顺序确实很重要。 以下是示例:
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"
这是否意味着,静态成员的处理方式与全局变量/函数完全相同,以后的静态成员是不会看到的?
答案 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>
时,他应该如何有意义地推断出你的实际意思?