почему при подстановке шаблона не удается указать пространство имен вызываемой функции? - PullRequest
0 голосов
/ 29 мая 2020

Рассмотрим этот код, который работает должным образом:

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, сигнализируя об ошибке вывода / замены аргумента шаблона.

Почему так происходит?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...