С помощью этой программы образца я наблюдаю другое поведение в г ++ и лязгПерегрузка операторов лязг ++ и г ++ отличается выход
foo.h:
#include <iostream>
namespace Bar
{
class Foo
{
public:
Foo(int x) : _x(x)
{}
int x() const
{
return _x;
}
private:
int _x;
};
}
std::ostream& operator <<(std::ostream& os, const Bar::Foo* foo);
foo.cpp
#include <Foo.h>
using namespace std;
ostream& operator <<(ostream& os, const Bar::Foo* foo)
{
return os << foo->x();
}
основной. cpp
#include <iostream>
using namespace std;
template<typename T>
void print(const T& t)
{
cout << t << endl;
}
#include <Foo.h>
int main(int argc, char** argv)
{
Bar::Foo* foo = new Bar::Foo(5);
print(foo);
}
Компиляция с помощью clang ++ и g ++ дает разные результаты:
air:~ jose$ clang++ Foo.cpp main.cpp -I.
air:~ jose$ ./a.out
0x7ff9e84000e0
air:~ jose$ g++ Foo.cpp main.cpp -I.
air:~ jose$ ./a.out
5
Какой из них правильный и почему ?.
Это может быть проще для людей, если вы разрешили '# include' для одного пастыруемого объекта. – PlasmaHH
Единственная часть этого я нахожу интересной, что она даже работает. 'Operator <<' принимает 'Bar :: Foo const *', но с помощью шаблона 'print()' вы отправляете 'Bar :: Foo * const' (ссылка в этом случае несущественна).Выньте шаблон и просто отправьте указатель-указатель на 'cout' и посмотрите, что вам дают обе привязки. * Лучше * быть одинаковым. – WhozCraig
Какой бы ни был прав, ваш код * неправильный * (или, по крайней мере, явно улучшенный). Вы должны объявить/определить, что 'operator <<' внутри пространства имен 'Bar', так что поиск аргумента зависит от него. –