考虑以下代码:
#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 位 G++ 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
大小相同,或者这是我应该报告的错误?