在 Visual Studio 中使用 __LINE__ 宏作为模板参数
Posted
技术标签:
【中文标题】在 Visual Studio 中使用 __LINE__ 宏作为模板参数【英文标题】:Using __LINE__ macro as a template parameter in visual studio 【发布时间】:2011-03-22 21:01:34 【问题描述】:我希望下面的代码可以工作,但我收到了编译错误:
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
来保存行号还是有标准解决方案?
【问题讨论】:
什么版本?在VS2010中工作。 (我以前做过,但还是尝试了你的代码。) @GMan:很有趣,在 VS2010 中也进行了测试,但对我不起作用。 o_O(或者你的意思是在全局范围内定义static const int
?这实际上会破坏目的......)
@GMan:我正在运行 2010 年的全新安装。
@Bob: @Xeo: Wtf...什么版本?我的:“10.0.30319.1 RTMRel”。
@Bob:如果您启用/ZI
(编辑并继续调试)选项,禁用此选项是否可以解决问题?
【参考方案1】:
在 VS 2010 10.0.40219.1 SP1Rel 和 Ideone 中为我工作
但 MSDN 提到了导致 C2975 的问题,如果在模板中使用 __LINE__
和编译器选项 /ZI
: MSDN C2975
编辑:对不起,我链接了德文版,here in english
【讨论】:
我也可以不使用/ZI
。
好发现!这也是有道理的,如果您要允许编辑并继续调试,__LINE__
不能是编译时间常数,因为实际的代码行可以在调试会话中更改。跨度>
我必须通过执行以下操作来使用/Zi
选项:***.com/a/15521991/1294758【参考方案2】:
对于它的价值,这应该是有效的代码。 __LINE__
应该表现得好像:
#define __LINE__ 0
当然,用当前行号替换 0。
【讨论】:
@In:为什么我们是幸运儿? :) @GMan:显然是因为我们不使用/ZI
标志。 :-)
@In:啊,因为我们不会犯错,也不需要那个选项,对吧? :)
不是答案,但无论如何都值得 +1
@GMan:实际上这是因为/ZI
不适用于 64 位目标,但我会同意你的理由。 :-)【参考方案3】:
@Bob,你会爱上这个!
我对你的问题很感兴趣,所以我尝试了你的代码。它在 g++ 中编译,但在 MSVC10 中出现错误并失败。为了进行调查,我使用 Google 来了解如何查看预处理器输出:您将“属性 | C++ | 预处理器 | 预处理到文件”设置为 true。然后我再次编译......它工作了!事实证明,如果禁用此选项,则编译失败;如果启用,编译工作。我想 MS 不会费心生成 LINE 条目,除非正在捕获预处理器输出。加油!
【讨论】:
你“假设”不正确。我使用了__LINE__
大约一百万次。
你不认为那些人已经打开了这个选项吗?以上是关于在 Visual Studio 中使用 __LINE__ 宏作为模板参数的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Visual Studio 2010 中更改 compute_'' 和 sm_'' 参数?
在 Visual Studio 2015 中使用 _ITERATOR_DEBUG_LEVEL 0 的字符串流访问冲突
C++ MS Visual Studio 错误“在函数公共中引用:void __thiscall ...”