0

Test::load应该将数据(按名称或索引描述)加载到传递的引用中。作为第三个参数,在加载失败的情况下有一个默认值(数据从文件加载)。

struct Test
{
    template <typename ValueType, typename DefaultValueType>
    void load(const char * c, ValueType & a, DefaultValueType b)
    {
        std::cout << "1";
    }

    template <typename ValueType, typename DefaultValueType>
    void load(int i, ValueType & a, DefaultValueType b)
    {
        std::cout << "2";
    }
};

我需要两者ValueTypeDefaultValueType因为我特别需要字符串和自定义类型。当我想使用默认构造类型作为const char *从 ValueType 推导出的默认第三个参数(在版本中)时,会出现问题。

template <typename ValueType, typename DefaultValueType>
void load(const char * c, ValueType & a, DefaultValueType b = ValueType())
{
    std::cout << "1";
}

我收到expects 3 arguments错误(vs2010)。

为什么它不起作用?我需要努力工作才能完成这项工作。


如果有人有兴趣玩,这里是完整的“工作”代码

#include <iostream>

struct Test
{
    template <typename ValueType, typename DefaultValueType>
    void load(const char * c, ValueType & a, DefaultValueType b/* = ValueType()*/)
    {
        std::cout << "1";
    }

    template <typename ValueType, typename DefaultValueType>
    void load(int i, ValueType & a, DefaultValueType b)
    {
        std::cout << "2";
    }

    //Workaround
    template<typename ValueType>
    void load(const char * c, ValueType & v)
    {
        load(c,v,ValueType());
    }
};

int main()
{
   Test t;
   float f;

   //This is standard behavior
   t.load("bar", f, 0.0f);

   //I want this to be possible call
   t.load("bar", f);
}
4

1 回答 1

2

您正在寻找部分模板专业化。然而,部分模板特化仅适用于类而不适用于函数。对于函数,您可以通过重载来解决问题,这正是您在解决方法中所做的。

这是一篇关于为什么模板函数有重载而不是特化的文章。

于 2012-12-18T17:26:30.103 回答