在Visual Studio中使用__LINE__宏作为模板参数

时间:2011-03-22 21:01:35

标签: c++ visual-studio

我希望以下代码能够正常工作,但我收到了编译错误:

error C2975: 'n' : invalid template argument for 'foo', expected compile-time constant expression
#include <iostream>
using namespace std;

template<int N>
struct foo
{
    foo() { cout << N << endl; }
};

int main()
{
    foo< __LINE__ > f;
}

为什么会这样?我虽然__LINE__会在模板实例化之前粘贴在行号中吗?

如果我想这样做,我应该引入static const int来保存行号或是否有标准解决方案?

3 个答案:

答案 0 :(得分:13)

在VS 2010 10.0.40219.1 SP1Rel和Ideone

中为我工作

但MSDN提到问题导致C2975,如果在带有编译器选项__LINE__的模板中使用/ZIMSDN C2975

编辑:对不起,我关联了德语版here in english

答案 1 :(得分:2)

对于它的价值,这被认为是有效的代码。 __LINE__假设表现得像:

#define __LINE__ 0

当然,用当前行号替换0。

答案 2 :(得分:0)

@Bob,你将这个!

我对您的问题很感兴趣,所以我尝试了您的代码。它以g ++编译,但在MSVC10中出错。为了研究,我使用Google来了解如何查看预处理器输出:将“属性| C ++ |预处理器|预处理到文件”设置为true。然后我再次编译......并且它工作了!如果禁用此选项,则结果是编译失败;如果它已启用,则编译有效。我想MS不会生成 LINE 条目,除非捕获预处理器输出。 Oy va voy!