代码之家  ›  专栏  ›  技术社区  ›  Matt Joiner

这个简单的模板类我做错了什么?

  •  1
  • Matt Joiner  · 技术社区  · 14 年前

    我写了一个小类来帮助转换MSVC的笨拙类型:

    template <class FromType>
    struct convert
    {
        convert(FromType const &from)
            :   from_(from) {}
        operator LARGE_INTEGER() {
            LARGE_INTEGER li;
            li.QuadPart = from_;
            return li;
        }
    private:
        FromType const &from_;
    };
    

    后来我这样做了:

    convert(0)
    

    并从MSVC获取此错误消息:

    1>e:\src\cpfs\libcpfs\device.cc(41):错误C2955:“转换”:使用类模板需要模板参数列表

    1>e:\src\cpfs\libcpfs\device.cc(17):请参阅“convert”的声明

    我以为 FromType 可以从我传递的整数推断出来吗?怎么回事?

    1 回复  |  直到 14 年前
        1
  •  4
  •   Drew Hall    14 年前

    类模板从不隐式实例化。根据你给出的类定义,你必须说:

    convert<int>(0)
    

    …调用该类的构造函数。

    使用默认的模板参数,可以改进(?)收件人:

    template <class FromType = int>
    struct convert
    { /* ... */ };
    

    然后将其调用为:

    convert<>(0)
    

    …但恐怕这是你用类模板所能做的最好的。您可能需要使用一个函数模板来为您实例化类对象:

    template <typename FromType>
    convert<FromType> make_convert(FromType from) {
       return convert<FromType>(from);
    }
    

    例如,这或多或少是std::make_pair()中使用的方法。