存在函数模板时的参数转换

Argument conversion in the presence of function templates

本文关键字:参数 转换 函数模板 存在      更新时间:2023-10-16

我有一组依赖于两个整数的函数模板。除了其中一个函数参数需要转换外,这些参数都需要实例化。为此提供了转换运算符。然而编译器(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中定义的aProxy<1>的隐式转换中推导出它。