c++ 其他项目中的模板专门化

jhdbpxl9  于 2022-12-24  发布在  其他
关注(0)|答案(1)|浏览(134)

我有C++17项目与以下项目布局:

src/
  Common/
  Main/

Common中,我有用于沙漠化的模板函数

namespace Common
{
  template <class T>
  T FromJson(std::string_view json)
}

Main中,我想对Main可访问类型Config进行专门化,我该怎么做呢?
我试过这个(Main/example.cpp):

#include "Common/Serialzation.hpp"
#include "Config.hpp"

namespace 
{
  template <>
  Main::Config Common::FromJson(std::string_view json) { 
     // use of other FromJson<T> specializations 
  }
}

/* other code that use FromJson<Main::Config> */

但这失败了。
为了解决这个问题,我修改了函数名(下面的代码可以正常工作):

#include "Common/Serialzation.hpp"
#include "Config.hpp"

namespace 
{
  Main::Config LoadFromJson(std::string_view json) { 
    // Common::FromJson is used here fine, no compile errors 
  }
}

/* other code that use FromJson<Main::Config> */

但是这个解决方案对我来说非常糟糕。

d7v8vwbk

d7v8vwbk1#

正如在注解中已经指出的,您需要在声明模板函数的相同名称空间中专门化模板函数。
例如,请参见以下代码:

#include <iostream>

namespace Common {
template <typename U>
void print(U u) { std::cout << "general " << u << std::endl; }

}

namespace Main {
    struct A { int x; };

}

namespace Common {

template <>
void print(Main::A i) { std::cout << "specialization " << i.x << std::endl; }

}

int main()
{
    Common::print('c');
    Common::print(Main::A{1});

}

相关问题