0

我有一组依赖于两个整数的函数模板。这些需要实例化,除了需要转换函数参数之一。为此目的提供了一个转换运算符。但是编译器(VS 2013 express preview)拒绝承认转换的可能性。请参阅下面的代码。

在conversion_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;
    }
};

在conversion_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 中注释掉代码),但没有运气。

任何见解都值得赞赏。谢谢你。

4

1 回答 1

1

这里的问题是C++ 在推导模板参数时不允许隐式转换

例如,当编译器尝试实例化func(a, p1)时,它可以立即推导出 N -> 1,但没有 M 的值,也不允许从atoProxy<1>中定义的隐式转换中推导出它Orig

于 2013-09-05T13:32:51.353 回答