我正在尝试从成员模板函数调用成员函数,但是它 抱怨成员函数没有重载。我如何解决它? 下面是测试代码。
class Test
{
public:
template <typename T>
void foo(int i, T param)
{
switch (i)
{
case 1:
fun(param);
break;
case 2:
bar(param);
}
}
void fun(string p)
{
std::cout << "string: " << p << std::endl;
}
void bar(double p)
{
std::cout << "double: " << p << std::endl;
}
};
int main() {
Test t;
t.foo(1, "hello");
t.foo(2, 100.0);
return 0;
}
错误:没有匹配的函数可以调用'Test :: fun(double&)'
答案 0 :(得分:3)
似乎要调用fun
或bar
取决于param
的{{1}}参数。如果您使用的是c ++ 17,则可以使用foo
来做到这一点:
if constexpr
和class Test
{
public:
template <typename T>
void foo(T param)
{
if constexpr (is_same_v<T,string> || is_same_v<T,const char*>)
fun(param);
else if (is_same_v<T,double>)
bar(param);
}
void fun(string p)
{
std::cout << "string: " << p << std::endl;
}
void bar(double p)
{
std::cout << "double: " << p << std::endl;
}
};
int main() {
Test t;
t.foo("hello");
t.foo(100.0);
return 0;
}
的{{1}}参数是不需要的,您可以根据int i
类型决定调用哪个foo
/ fun
。
答案 1 :(得分:1)
对于给定类型typename T
,仅当函数主体中的每个语句均有效时,才能实例化函数模板。特别是,这包括您的fun
和bar
通话。
要修复它,您需要先修复设计。从代码示例中得出的结论来看,我认为您需要类似于以下内容的
void foo(double param)
{
bar(param);
}
void foo(string param)
{
fun(param);
}