以下行在 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/