找不到模板重载
template overload not found
我试图理解为什么在下面的代码中断言失败。
// 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!
}
如果没有实现其他显式转换函数,则认为主 dconvert 函数断言。
我不明白的是为什么看不到 dconvert 函数重载。
如果我删除这些行:
C c;
::dconvert(3,c);
或者如果我保留上述内容并删除
dconvert<FromStruct,int>(from, 5);
不抛出断言
这是因为在:
template<class FromStruct>
void dconvert(FromStruct from,
C to)
你这样做:
dconvert<FromStruct,int>(from, 5);
因此明确要求实例化第一个模板(因为它是唯一具有两个模板参数的模板(方法。如果您要删除此需求,例如,通过保留它来允许模板类型扣除:
dconvert(from, 5);
代码可以毫无问题地编译。 在 clang6.0 上测试。
相关文章:
- 为什么 std::sort 找不到合适的(静态成员)函数重载?
- 找不到模板重载
- C++ 模板:重载时找不到基类类型参数方法
- 如何修复找不到匹配的重载函数?
- ADL 找不到重载函数
- 为什么找不到使用命名空间中定义的类型实例化的 std::weak_ptr 的重载运算符==?
- 为什么 std::regex_search 找不到合适的重载?
- C++:创建线程时出现问题;错误 C2672:"std::invoke":找不到匹配的重载函数
- 为什么我们在使用宏时找不到合适的运算符重载
- 当我尝试编译程序时,我遇到了一堆错误,例如:'std::max':找不到匹配的重载函数
- 为什么找不到重载运算符函数?
- 在重载运算符中找不到错误<
- 找不到 VS2010 重载成员函数
- 添加指针导致类错误,找不到重载的成员函数
- 为什么 range-for 找不到 std::istream_iterator 的开始和结束重载?
- G++ 在类型转换后找不到重载函数
- 在"着色器程序"中找不到 C++ 重载成员函数
- 如果存在具有不同参数类型的重载,则在全局命名空间中找不到函数
- 错误C2511-找不到重载的成员函数
- boost.log std::异常格式化程序找不到运算符<< 自己的命名空间中的重载