我有以下代码(不,模板没有在任何地方实例化):
#define cAssert( expr ) typedef char __C_ASSERT__[( expr )?1:-1]
template<int t>
void f()
{
cAssert( t != 0 );
cAssert( t != 2 );
}
用 Visual C++ 编译得很好(当然,当 t
既不是 0 也不是 2 时)。然而 gcc(4.9.0 及更早版本 - 您可以在 http://gcc.godbolt.org/ 上测试它们)输出:
In function ‘void f()’:
1 : error: conflicting declaration ‘typedef char __C_ASSERT__ [((t != 2) ? 1 : (-1))]’
#define cAssert( expr ) typedef char __C_ASSERT__[( expr )?1:-1]
如果我只留下一个cAssert()
(两者中的任何一个) - 它编译得很好。只有当我同时拥有它们时,问题才会出现。
为什么 gcc 会拒绝此代码以及如何解决此问题?
最佳答案
我不知道为什么这不起作用。
一个半修复:
#define cAssertbraces( expr ) typedef char __C_ASSERT_BRACES__[( expr )?1:-1]
template<class T>
void cAssert(T v1, T v2) { {cAssertbraces( v1 != v2 );} }
template<int t>
void f()
{
{cAssertbraces( t != 0 );}
{cAssertbraces( t != 2 );}
cAssert(t, 0);
cAssert(t, 2);
}
或者,像这样使用__LINE__
:
#define STATIC_ASSERT(COND,MSG) typedef char static_assertion_##MSG[(!!(COND))*2-1]
#define COMPILE_TIME_ASSERT3(X,L) STATIC_ASSERT(X,static_assertion_at_line_##L)
#define COMPILE_TIME_ASSERT2(X,L) COMPILE_TIME_ASSERT3(X,L)
#define COMPILE_TIME_ASSERT(X) COMPILE_TIME_ASSERT2(X,__LINE__)
...
COMPILE_TIME_ASSERT( t != 2 );
我取自此question (那里的答案很好,应该检查)。
关于c++ - 为什么使用 gcc 和模板函数使用两个或更多基于 typedef 的静态断言时会出现 "conflicting declaration"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28031246/