c++ - 推导嵌套模板的模板参数失败

标签 c++ templates compiler-errors

好吧,我通读了很多“无法推断模板参数”的问题,但似乎没有一个符合我的情况——或者我不明白答案……

one我觉得方向是正确的,但我未能为我的问题提取解决方案。

我的标题中的精简代码如下所示:

template<typename T>
class TemplateProblem
{
public:
    // Do I really need this or did I miss something from the STL?
    template<typename Tin, typename Tout>
    struct UnaryFunction : public std::unary_function<Tin, Tout>
    {
        virtual Tout operator()(Tin input) = 0;
    };

    template<typename Tin, typename Tout>
    struct StaticCast : public UnaryFunction<Tin, Tout>
    {
        virtual Tout operator()(Tin input)
        {
            return static_cast<Tout>(input);
        }
    };

private:
    T * const _data;
    T const _bias;

    template<typename Tin>
    void Init(Tin * data, int length, UnaryFunction<Tin, T> mapper, Tin bias);

public:
    template<typename Tin>
    TemplateProblem(Tin * data, int length, Tin bias = Tin());

    template<typename Tin>
    TemplateProblem(Tin * data, int length, UnaryFunction<Tin, T> mapper, Tin bias = T());
};

template<typename T>
template<typename Tin>
void TemplateProblem<T>::Init(Tin * data, int length, UnaryFunction<Tin, T> mapper, Tin bias)
{
    T mappedBias = mapper(bias);
    for (int i = 0; i < length; i++)
    {
        _data[i] = data[i] + mappedBias;
    }
}

template<typename T>
template<typename Tin>
TemplateProblem<T>::TemplateProblem(Tin * data, int length, UnaryFunction<Tin, T> mapper, Tin bias = T())
    : _data(new T[length]), _bias(bias)
{
    Init(data, length, mapper, bias);
}

template<typename T>
template<typename Tin>
TemplateProblem<T>::TemplateProblem(Tin * data, int length, Tin bias = T())
    : _data(new T[length]), _bias(bias)
{
    StaticCast<Tin, T> cast;
    Init(data, length, cast, bias);
}

我像这样实例化它:

unsigned char pixels[] = {23, 42, 65, 97};
TemplateProblem<int> tp(pixels, 4);

从 VS2012 我得到这些消息:

Error   1   error C2784: 'void TemplateProblem<T>::Init(Tin *,int,TemplateProblem<T>::UnaryFunction<Tin,T>,Tin)' : could not deduce template argument for 'TemplateProblem<T>::UnaryFunction<Tin,T>' from 'TemplateProblem<T>::StaticCast<Tin,Tout>'    ...\templateproblem.h   62  1   TemplateProblem
Error   2   error C2893: Failed to specialize function template 'void TemplateProblem<T>::Init(Tin *,int,TemplateProblem<T>::UnaryFunction<Tin,T>,Tin)' ...\templateproblem.h   62  1   TemplateProblem

当我将两个 struct 作为 this answer 移出 class 时,也会发生错误。建议。

最佳答案

编译器错误对于指示实际问题不是很有帮助。

实际问题是你传递了UnaryFunction<Tin, T>按值(value)给你的Init函数(和构造函数之一),但所有实例化 UnaryFunction<>结果是一个抽象类(不能按值传递)。 简单的解决方案是对 UnaryFunction 使用传递引用,所以 mapper引用传入的实际对象。

STL 中用于传递仿函数的典型解决方案是使用单独的模板参数,如下所示:

template<typename T>
template<typename Tin, Tmapper>
void TemplateProblem<T>::Init(Tin * data, int length, Tmapper mapper, Tin bias)
{
    T mappedBias = mapper(bias);
    for (int i = 0; i < length; i++)
    {
        _data[i] = data[i] + mappedBias;
    }
}

那么你不需要UnaryFunctionL<>基类。如果不兼容 mapper被传递,这个在函数体中使用时会被诊断出来。

关于c++ - 推导嵌套模板的模板参数失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13948692/

相关文章:

c++ - 类型特征以获取 std::array 或 C 风格数组的元素类型

c++ - 模板编译错误 - 标准与否?

c++ - 从 shell 命令读取值 Linux

c++ - 使用默认模板参数引入派生类型

C++-转换函数模板推导,为什么会这样?

尽管函数调用的参数数量不正确,C 程序仍可编译

c - 如何通过终端编译C文件

swift - “The compiler is unable to type-check this expression in reasonable time”提供一个简单的公式

c++ - 我应该对字符串使用 unique_ptr 吗?

c++ - 替换 msvc 上的 vsscanf