Немного поэкспериментировав с шаблонами C ++, мне удалось создать этот простой код, для которого выходные данные отличаются от ожидаемых в соответствии с моим пониманием правил C ++.
void bar(double d)
{
std::cout << "bar(double) function called" << std::endl;
}
template <typename T> void foo(T t)
{
bar(3);
}
void bar(int i)
{
std::cout << "bar(int) function called" << std::endl;
}
int main()
{
foo(3);
return 0;
}
Когда я компилирую этот кодв VC ++ 2008 Express вызывается функция bar(int)
.Это было бы поведение, я ожидаю, если bar(3);
в теле шаблона зависит от параметра шаблона.Но это не так.Правило, которое я обнаружил здесь , гласит: «Стандарт C ++ предписывает, что все имена, которые не зависят от параметров шаблона, привязываются к их текущим определениям при разборе функции или класса шаблона».Я не прав, что «текущее определение» bar
при разборе функции шаблона foo
является определением void bar(double d);
?Почему это не так, если я ошибаюсь.В этом модуле компиляции нет предварительных объявлений bar
.