c++ - 存在函数模板时的参数转换

标签 c++ function templates arguments type-conversion

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

在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 &’的模板参数。请参阅函数声明。”

我试过替换

operator SpecialProxy() const;

通过

operator const SpecialProxy&() const;

但错误仍然存​​在。

还尝试显式实例化所需的函数(在 conversion_op.cpp 中注释掉代码),但没有成功。

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

最佳答案

这里的问题是 C++ does not allow implicit conversion when deducing template arguments .

当编译器尝试实例化 func(a, p1) 时例如,它可以迅速推导出N -> 1,但是M没有值,也不允许从a的隐式转换中推导出来。至 Proxy<1>Orig 中所定义.

关于c++ - 存在函数模板时的参数转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18499185/

相关文章:

c++ - 使用静态强制转换时,强制转换为类类型还是对象引用更有意义?

c++ - ZMQ 导致主线程卡住(或类似的东西..?)

c++ - 虚函数中的默认参数

function - 作为类型化函数的 TypeScript 变量

带有变量的 PHP 模板类?

c++ - 在 map 中包含一个类模板

c++ - 在 Python 的 SWIG 中包装 boost::shared_ptr 的 std::vector

Javascript:将函数参数与字符串结合起来引用var

php - Wordpress作者框控制功能

c++ - 显式实例化的模板方法中的编译错误