假设我有一个功能:
template<class T>
void save(aType var1, aType var2, T varT) // var1, var2 - do not matter
{
// ...
}
现在我有一个类,它为自己定义了这个函数,作为成员函数
class A {
public:
....
void save(aType var1, aType var2); // the same as before; only 2 arguments
};
以下是成员函数类的实现:
// A.cpp
#include "save.h"
#include "A.h"
void A::save(aType var1, aType var2){
save(var1,var2,one-of-the-members); // here we try to call templated function
}
结果,编译器说没有匹配函数来调用A :: save(var1,var2,var3)候选者是:A :: save(var1,var2);那就是编译器尝试使用类A的成员函数(在此函数的实现中) - 使用2个参数,但看起来它没有看到3个参数的模板化版本。 如何使模板版本赢得成员函数?
修改 感谢以前的所有答案。建议的方法仍然无济于事。嗯,实际上并非。以下是一些更多细节/问题:
除模板版外:
template<class T>
void save(aType var1, aType var2, T varT) // var1, var2 - do not matter
{
// ...
}
我还为一些更具体的类型重载了函数,所以我也有:
void save(aType var1, aType var2, Type1 varT);
void save(aType var1, aType var2, Type2 varT);
void save(aType var1, aType var2, Type3 varT);
...
建议的方法(例如,使用::带来全局范围)有助于我评论模板化定义,否则存在一些无关的编译器错误。所以我的下一个问题是:是否有可能重载函数并具有模板化版本?他们似乎在竞争。
我还考虑过对类型(变量varT)进行运行类型识别:
if(typeid(varT).name()==type_name_1){ ... }
else if(typeid(varT).name()==type_name_2){ ... }
...
但我认为这样效率低,所以这不是好方法。所以我想用它来为基本类型(int,double等)使用模板化版本 - 所以不要为每个类型显式重载 - 并使用我自己的函数来处理更复杂的类型。是否有可能有效地做到这一点?提前致谢。
答案 0 :(得分:3)
显式限定调用,或使用using声明将其带入范围。
明确资格:
::save(var1,var2,one-of-the-members);
使用声明:
using ::save;
答案 1 :(得分:0)
::save(var1,var2,one-of-the-members);
:: qualifier将匹配一个自由函数,而不是一个成员函数。顺便说一句:你的问题与模板无关。这是一个成员函数/自由函数问题。