4

Following line compiles successfully on g++ but gives error on clang::

static_assert(tBits <= sizeof(ULONG)*8, "This is IO method");

g++ warning ::

there are no arguments to 'static_assert' that depend on a template parameter, so a declaration of 'static_assert' must be available

clang error ::

use of undeclared identifier 'static_assert'; did you mean 'static_cast'?

please help me out.

Function declaration from comment:

template < size_t tBits >
HRESULT DoIO( std::bitset< tBits >& bitsetToSerialize ) const
4

1 回答 1

2

“static_assert”是在 C++11 中作为语言关键字引入的——不是函数或宏。

两个编译器都给你“我不知道这个函数”警告/错误。

为了让编译器在您使用“static_assert”时为您提供“我不知道这个函数”,编译器不得使用 C++11 支持 (-std=c++11) 进行编译。

为了证明这一点,我采用了以下代码:

#include <bitset>

template<size_t tBits>
int DoIO(std::bitset<tBits>& /*bitsetToSerialize*/)
{
    static_assert(tBits <= sizeof(unsigned long) * 8, "tBits is too big.");
    return tBits;
}

然后我用 GCC 4.7.3 编译它,我得到了以下错误:

osmith@olivia64 ~/src $ g++ -o sa.o -c sa.cpp
sa.cpp:在函数'int DoIO(std::bitset<_Nb>&)'中:
sa.cpp:6:78: 错误:“static_assert”没有依赖于模板参数的参数,因此“static_assert”的声明必须可用 [-fpermissive]
sa.cpp:6:78: 注意:(如果你使用'-fpermissive',G++ 将接受你的代码,但不允许使用未声明的名称)

然后我在启用 C++11 支持的情况下编译它并且编译没有问题:

osmith@olivia64 ~/src $ g++ -std=c++11 -o sa.o -c sa.cpp -Wall
osmith@olivia64 ~/src $

所以,然后我用 Clang 编译它

osmith@olivia64 ~/src $ clang++ -o sa.o -c sa.cpp
sa.cpp:6:9:错误:使用未声明的标识符“static_assert”;你是说'static_cast'吗?
        static_assert(tBits <= sizeof(unsigned long) * 8, "tBits 太大了。");
        ^
产生 1 个错误。

最后我使用 C++ 11 支持的 Clang 编译它,它编译得很好。

osmith@olivia64 ~/src $ clang --version
Ubuntu clang 版本 3.2-1~exp9ubuntu1 (tags/RELEASE_32/final) (基于 LLVM 3.2)
目标:x86_64-pc-linux-gnu
线程模型:posix
osmith@olivia64 ~/src $ clang++ -std=c++11 -o sa.o -c sa.cpp
osmith@olivia64 ~/src $

可以肯定的是,让编译器有机会帮助我们并打开“-Wall”:

osmith@olivia64 ~/src $ g++ -Wall -o sa.o -c sa.cpp
sa.cpp:6:9:警告:标识符“static_assert”是 C++11 [-Wc++0x-compat] 中的关键字
sa.cpp:在函数'int DoIO(std::bitset<_Nb>&)'中:
sa.cpp:6:78: 错误:“static_assert”没有依赖于模板参数的参数,因此“static_assert”的声明必须可用 [-fpermissive]
sa.cpp:6:78: 注意:(如果你使用'-fpermissive',G++ 将接受你的代码,但不允许使用未声明的名称)
于 2013-05-29T05:06:42.563 回答