次のコードを検討してください。
#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