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";
}
};
我需要ValueType
和DefaultValueType
,因为我特别需要字符串和自定义类型。
当我想使用默认构造类型作为从ValueType推导出的默认第三个参数(在const char *
版本中)时,会出现问题。
template <typename ValueType, typename DefaultValueType>
void load(const char * c, ValueType & a, DefaultValueType b = ValueType())
{
std::cout << "1";
}
我收到expects 3 arguments
错误(vs2010)。
为什么它不起作用?我需要做workaroud来完成这项工作。
如果有兴趣玩游戏,这里是完整的“工作”代码
#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);
}
答案 0 :(得分:2)
您正在寻找部分template specialization。但是,部分模板专门化仅适用于类而不适用于函数。对于函数,您可以通过重载来解决问题,这正是您在解决方法中所做的。
这是关于模板函数重载而不是特化的原因的writeup。