Рассмотрим этот код, который работает должным образом:
serialization.h
#include <QJsonObject>
namespace ns{
QJsonValue serialize(int, Version);
QJsonValue serialize(double, Version);
class ObjectSerializer
{
public:
template<typename T>
void insert(const QString& key, const T& value)
{
_obj.insert(key, serialize(value)); // <-- Focus here
}
QJsonObject object() const { return _obj; }
private:
QJsonObject _obj;
};
}
foo.h
#include "serialization.h"
namespace ns{
struct Foo{};
QJsonValue serialize(const Foo&, Version) { // ... }
}
bar.h
#include foo.h
namespace ns{
struct Bar{
int a;
Foo f;
};
QJsonValue serialize(const Bar& b, Version)
{
ObjectSerializer s;
s.insert("a", b.a);
s.insert("f", b.f);
return s.object();
}
}
вызов bar.serialize()
работает нормально, потому что он может правильно вывести функцию для вызова int a
и Foo f
, но если я определю insert()
следующим образом:
template<typename T>
void insert(const QString& key, const T& value)
{
_obj.insert(key, ns::serialize(value)); // <-- I'm explicitly referring to namespace
}
компилятор по-прежнему может вывести вызов serialize(int, Version)
для bar.a
, но не serialize(const Foo&, Version)
для bar.f
, сигнализируя об ошибке вывода / замены аргумента шаблона.
Почему так происходит?