このコードはどのように動作する必要がありますか?関数で修飾名を使用すると、オーバーロードを無視してジェネリック関数を呼び出しcall_read()
ます。修飾されていない名前を使用すると、最初にオーバーロードが呼び出され、次に汎用バージョンが呼び出されます。違いは何ですか?GCCのバグですか?
#include <iostream>
struct info1 {};
struct info2 {};
template<class T> void read(T& x)
{
std::cout << "generic" << std::endl;
}
template<class T> void call_read(T& x)
{
::read(x); // if I replace ::read(x) with read(x) the overload is called
}
void read(info1& x)
{
std::cout << "overload" << std::endl;
}
int main()
{
info1 x;
info2 y;
call_read(x);
call_read(y);
}
また、基本的なタイプでは動作が異なることに気づきました。以下のコードを参照してください
#include <iostream>
typedef struct info1 {};
typedef struct info2 {};
typedef int info3;
typedef double info4;
template<class T> void read(T x)
{
std::cout << "generic" << std::endl;
}
template<class T> void call_read(T x)
{
read(x);
}
void read(info1 x)
{
std::cout << "overload" << std::endl;
}
void read(info3 x)
{
std::cout << "overload" << std::endl;
}
int main()
{
call_read(info1());
call_read(info2());
call_read(info3());
call_read(info4());
}
オーバーロードされた関数を2回呼び出すことになっていますが、そうではありません。ここで結果を参照して くださいhttp://codepad.org/iFOOFD52