Я так понимаю особенность известная, но я хотел бы кое что для себя прояснить.
Есть элементарный код, который при компиляции в VC и в GCC дает разный результат:
#include <iostream>
#include <stdio.h>
void foo()
{
std::cout << "\r\nGlobal\r\n";
}
template <typename T> class Base {
public:
void foo()
{
std::cout << "\r\nBase\r\n"; }
};
template <typename T> class Derived : public Base<T> {
public:
int call_foo () {
foo();
return 1;
}
};
int main(int argc, char* argv[])
{
//foo = 666;
Derived<int> h;
h.call_foo();
//std::cout << h.get_foo() << std::endl;
return 0;
}
VC(2008 и старшие):
Base
GCC(4.6.1):
Global
Я не хочу вдаваться в такие вещи как "two-phase name lookup" или ADL, потому что все таки это особенности реализации компиляторов, и в стандарте о них нет ни слова.
Я хочу понять, какое поведение как
правильное определяется стандартом ?
И как с этим вообще жить ? Почему так ?:)