2016-02-18 4 views
0

Сегодня я обнаружил, что порядок статических членов класса имеет значение. Вот это пример:Порядок статических членов класса

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

быстрое изменение добавлено – ligoore

ответ

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: undeclared identifier

Потому что он не имеет ни малейшего представления, что это такое. Когда у вас это есть, наоборот, компилятор знает, что такое Test, поэтому он просто компилируется.

-1

Вы не можете ссылаться на то, что не было объявлено. Когда компилятор встречает Test<T>, как он должен осмысленно выводить то, что вы на самом деле имеете в виду?

+0

Чтобы быть справедливым, вы можете фактически ссылаться на то, что еще не было объявлено. Одним из примеров являются методы класса - вы можете вызвать другой метод класса внутри встроенного метода, хотя вызываемый метод объявляется позже в объявлении класса. Но это не работает с объявлениями типа (класса), хотя и вложенными. – axalis

+0

(еще один пример - атрибуты члена класса - вы также можете ссылаться на них внутри методов ранее в исходном коде, несмотря на то, что компилятор еще не «видел» их, когда они объявлены только в конце объявления класса) – axalis

Смежные вопросы