名前空間内でオーバーロードされた関数を呼び出そうとしていますが、少し苦労しています。
実施例 1: 名前空間なし
class C {};
inline void overloaded(int) {}
template<typename T> void try_it(T value) {
overloaded(value);
}
inline void overloaded(C) {}
int main()
{
try_it(1);
C c;
try_it(c);
return 0;
}
作業例 2: テンプレートの前に定義されたすべてのオーバーロード
class C {};
namespace n {
inline void overloaded(int) {}
inline void overloaded(C) {}
}
template<typename T> void try_it(T value) {
n::overloaded(value);
}
int main()
{
try_it(1);
C c;
try_it(c);
return 0;
}
壊れた例 3: テンプレートの後のいくつかのオーバーロード
class C {};
namespace n {
inline void overloaded(int) {}
}
template<typename T> void try_it(T value) {
n::overloaded(value);
}
namespace n {
inline void overloaded(C) {}
}
int main()
{
try_it(1);
C c;
try_it(c); // /tmp/test.cpp: In function ‘void try_it(T) [with T = C]’:
// /tmp/test.cpp:19:15: instantiated from here
// /tmp/test.cpp:8:7: error: cannot convert ‘C’ to ‘int’ for argument ‘1’ to ‘void n::overloaded(int)’
return 0;
}
これはなぜですか?テンプレート関数の後にオーバーロードを宣言または定義できるようにするには、何をする必要がありますか?