Использование макроса __LINE__ в качестве параметра шаблона в visual studio

Я ожидал, что следующий код будет работать, но я получил ошибку компиляции:

error C2975: 'n' : invalid template argument for 'foo', expected compile-time constant expression 
 #include  using namespace std; template struct foo { foo() { cout << N << endl; } }; int main() { foo f; } 

Почему это происходит? Я, хотя __LINE__ будет вставлять номер строки до создания шаблона?

Если бы я хотел сделать это, я должен просто ввести static const int для хранения номера строки или есть стандартное решение?

Работает для меня в VS 2010 10.0.40219.1 SP1Rel и в Ideone

Но MSDN упоминает проблемы, которые приводят к C2975, если использовать __LINE__ в шаблоне с параметром компилятора /ZI : MSDN C2975

Редактировать: Извините, я связал немецкую версию, здесь, на английском языке

Для чего это стоит, это, предположительно, действительный код. __LINE__ должен вести себя так, как если бы это было:

 #define __LINE__ 0 

Конечно, заменив 0 на текущий номер строки.

@Bob, вам понравится этот!

Меня интересовал ваш вопрос, поэтому я попробовал ваш код. Он скомпилирован в g ++, но не с вашей ошибкой в ​​MSVC10. Чтобы исследовать, я использовал Google, чтобы узнать, как увидеть вывод препроцессора: вы установите для параметра «Свойства | C ++ | Препроцессор | Препроцесс в файл» значение true. А потом я снова собрал … И ЭТО РАБОТАЛО! Оказывается, если эта опция отключена, сбой компиляции; если он включен, компиляция работает. Я полагаю, что MS не хочет генерировать записи LINE, пока не будет захвачен вывод препроцессора. Oy va voy!