找不到模板重载

时间:2018-08-23 09:50:19

标签: c++ templates compiler-errors overloading template-specialization

我试图理解为什么在以下代码中断言失败。

List<String>

如果未实现其他显式转换函数,则认为主要dconvert函数会断言。

我不明白的是为什么没有看到dconvert函数重载。

如果我删除这些行:

incompatible types: inferred type does not conform to upper bound(s)
  inferred: java.util.Collection<? extends java.lang.Object>
  upper bound(s): java.util.List<java.lang.String>,java.lang.Object

或者如果我保留上述内容并且删除了

// file dconvert.h
struct A{};
struct B{int n;};
struct C{double cc;};

template<class FromStruct, class ToStruct>
void dconvert(FromStruct from, ToStruct to)
  {
  struct Placeholder {FromStruct f;};
  static_assert(std::is_same<Placeholder, FromStruct>::value, "CONVERSION NOT DEFINED");
  }

template<class FromStruct>
void dconvert(FromStruct from,
              int to)
  {

  }

template<class FromStruct>
void dconvert(FromStruct from,
              C to)
  {

  dconvert<FromStruct,int>(from, 5);

  }


// file main.cpp
#include <dconvert.h>
int main()
{
  ::dconvert(3,1); // ok
  C c;
  ::dconvert(3,c); // static assertion fails!
}

没有引发断言

1 个答案:

答案 0 :(得分:2)

这是因为:

template<class FromStruct>
void dconvert(FromStruct from,
              C to)

您这样做:

dconvert<FromStruct,int>(from, 5);

因此明确要求实例化第一个模板(因为它是唯一具有两个模板参数的模板)方法。如果您要删除此需求,例如通过允许通过保留模板类型来进行推断:

dconvert(from, 5);

代码可以毫无问题地进行编译。 在clang6.0上进行了测试。