以下から始めます ( を使用gcc version 4.0.1
):
namespace name {
template <typename T>
void foo(const T& t) {
bar(t);
}
template <typename T>
void bar(const T& t) {
baz(t);
}
void baz(int) {
std::cout << "baz(int)\n";
}
}
(グローバル名前空間に)追加すると
struct test {};
void bar(const test&) {
std::cout << "bar(const test&)\n";
}
すると、思った通り、
name::foo(test()); // produces "bar(const test&)"
しかし、私が追加するだけなら
void bar(const double&) {
std::cout << "bar(const double&)\n";
}
このオーバーロードが見つからないようです:
name::foo(5.0) // produces "baz(int)"
そのうえ、
typedef std::vector<int> Vec;
void bar(const Vec&) {
std::cout << "bar(const Vec&)\n";
}
どちらも表示されないので、
name::foo(Vec());
コンパイラエラーを与える
error: cannot convert ‘const std::vector<int, std::allocator<int> >’ to ‘int’ for argument ‘1’ to ‘void name::baz(int)’
これはルックアップがどのように機能するはずですか?(注: namespace を削除するname
と、すべてが期待どおりに機能します。)
bar
オーバーロードが考慮されるように、この例をどのように変更できますか? (オーバーロードはテンプレートの前に考慮されるべきだと思いましたか?)