存在函数模板时的参数转换
Argument conversion in the presence of function templates
我有一组依赖于两个整数的函数模板。除了其中一个函数参数需要转换外,这些参数都需要实例化。为此提供了转换运算符。然而编译器(VS2013express预览版)拒绝承认转换的可能性。请参阅下面的代码。
对话中_op.h
template<int N>
class Proxy
{
};
template<int M, int N>
void func(const Proxy<M>& p1, const Proxy<N>& p2)
{
}
typedef Proxy<1> SpecialProxy;
class Orig
{
SpecialProxy P;
public:
operator SpecialProxy() const
{
return P;
}
};
在conversation_op.cpp 中
#include "conversion_op.h"
//template void func(const SpecialProxy&, const SpecialProxy&);
//template void func(const SpecialProxy&, const Proxy<2>&);
//template void func(const Proxy<2>&, const SpecialProxy&);
//template void func(const Proxy<2>&, const Proxy<2>&);
int Test()
{
Orig a;
SpecialProxy p1;
Proxy<2> p2;
func<1,1>(a, p1); //OK
func<1,2>(a, p2); //OK
func<1,1>(p1, a); //OK
func<2,1>(p2, a); //OK
func(a, p1); //Error
func(a, p2); //Error
func(p1, a); //Error
func(p2, a); //Error
}
错误为:"无法从'Orig'推导'const-Proxy&'的模板参数。请参阅func的声明。"
我试着更换
operator SpecialProxy() const;
通过
operator const SpecialProxy&() const;
但是误差保持不变。
还尝试显式实例化所需的函数(conversion_op.cpp中注释掉的代码),但没有成功。
任何见解都值得赞赏。非常感谢。
这里的问题是C++在推导模板参数时不允许隐式转换。
例如,当编译器试图实例化func(a, p1)
时,它可以迅速推导出N->1,但没有M的值,也不允许从Orig
中定义的a
到Proxy<1>
的隐式转换中推导出它。
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 如何将向量中的可变参数转换为参数的持有者?
- c++ 构造函数 将 1 个字符串参数转换为 3 个属性
- 将空*参数转换为各种类型的参数是UB吗?
- 将可变参数模板参数转换为 JSON 字符串
- C++ 如何将函数参数转换为字符串
- 功能指针参数参数转换为const
- 避免对模板运算符过载的隐式参数转换
- 将C 方法参数转换为模板参数会因编译错误而失败
- 将参数转换为lpwstr createProcess
- 在与时间一起使用 srand 时,如果我没有time_t参数明确地将参数转换为无符号的 int 参数,这有关系吗?
- 将C++整型模板参数转换为整型"longer"型
- 将参数转换为目标类型时,复制用于直接初始化的构造函数省略
- 将命令行参数转换为qimage
- 将可变数量的参数转换为明确的数量
- SDL 方法,参数转换
- 通过错误检查将参数转换为整数
- 功能参数转换为儿童类C
- 参数转换在课堂上
- 在窗口上将格式化的 C 字符串和参数转换为 wstring