c++ - 为什么使用 gcc 和模板函数使用两个或更多基于 typedef 的静态断言时会出现 "conflicting declaration"错误?

标签 c++ templates gcc static-assert

我有以下代码(不,模板没有在任何地方实例化):

#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/

相关文章:

c - 解释force_align_arg_pointer函数属性

c++ - SSE版本的差平方和算法的累积计算误差

带有模板基类的 C++ std::shared_pointer

perl - 如何在使用 XS 的 Perl 程序中使用 Ada 模块?

django - 为什么 Django 不会自动转义我的 &lt;script&gt; 标签?

C++:如何重用我的模板代码

c - 如何使用 gcov 对动态库进行单元测试?

c++ - 如何定义隐式转换运算符

C++ 多重继承 - 相同的方法名称 - 我可以以某种方式删除其中一个吗?

c# - 在 WinForms 中嵌入 XNA