考虑下面的代码:64位G ++ 4.6.3在专用函数模板中不会将long视为long long,尽管它们的大小相同。这是一个错误?
#include <iostream>
#include <cinttypes>
template<class T>
void f();
template<>
inline void f<long long>() {
std::cout<<"f<long long>()"<<std::endl;
}
int main(int , char**) {
std::cout<<"sizeof(long)="<<sizeof(long)<<std::endl;
std::cout<<"sizeof(long long)="<<sizeof(long long)<<std::endl;
f<int64_t>();
return 0;
}
32位G ++ 4.6.3编译此成功并且产生输出:
sizeof(long)=4
sizeof(long long)=8
f<long long>()
在64位ģ编译++ 4.6.3然而产生连接错误:
undefined reference to `void f<long>()'
ld returned 1 exit status
即使编译并与f<int64_t>()
行注释掉运行产生:
sizeof(long)=8
sizeof(long long)=8
是否有一个很好的理由,为什么64位的G ++对待f<long>
和f<long long>
为不同的功能,即使long
和long long
大小相同,或者这是我应该报告的错误?
+1提到标准说他们是不同的类型。这是有道理的,因为否则32位G ++将无法使用32位整型长整型和64位整型长整型长整型,但当将使用QT的qint64的代码与使用int64_t的代码混合使用时,会导致恼人的不兼容性,如64位G ++中的qint64 = long long和int64_t = long。不管怎样,谢谢! – Ose