Путаница в переопределении классов
Привет.
Началось все с того, что захотел сделать и думал, что сделал, «локальный» класс, т.е. определил и использовал его в одном .cpp-файле. Много времени спустя случилось так, что создал в том же неймспейсе класс с тем же именем внутри другого .cpp-файла, и эти классы перемешались.
Минимальный пример для воспроизведения:
2.h:
#ifndef _2_H_
#define _2_H_
void foo();
#endif /* _2_H_ */
#include<stdio.h>
class test{
public:
void foo(){printf("test::foo()\n");}
};
void foo(){
xx::test t;
t.foo();}
#include<stdio.h>
#include"2.h"
class test{
public:
virtual /* (1) */ void foo(){printf("ta-dam!\n");}
};
int main(){
test(); /* (2) */
foo();
return 0;}
Итак. Если оставляем все как есть, программа печает тадам. Если убираем создание объекта (2), или виртуальность (1), программа печатает тест::фуу. Это нормально? И как таки правильно определить «локальный» класс?
gcc (Gentoo 4.6.3 p1.3, pie-0.5.2) 4.6.3