以下行在 g++ 上编译成功,但在 clang:: 上出错:

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

g++警告::



叮当错误::



请帮帮我。

注释中的函数声明:
template < size_t tBits >
HRESULT DoIO( std::bitset< tBits >& bitsetToSerialize ) const

最佳答案

“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&)’中:
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 ^
产生了 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&)’中:
sa.cpp:6:78: 错误:“static_assert”没有依赖于模板参数的参数,因此“static_assert”的声明必须可用 [-fpermissive]
sa.cpp:6:78:注意:(如果您使用‘-fpermissive’,G++ 将接受您的代码,但不推荐使用未声明的名称)

关于c++ - 代码在 g++ 上编译并带有警告,但在 clang3.1(Xcode 4.3.3) 上给出相同代码的错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13135875/

10-12 07:36