从模板函数调用非模板函数
Invoking non template function from template function
我正在尝试从成员模板函数调用成员函数,但是它
抱怨成员函数没有重载。我如何解决它?
下面是测试代码。
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;
}
error: no matching function for call to 'Test::fun(double&)'
对于给定的类型typename T
,只有当函数体中的每个语句都有效时,函数模板才能被实例化。特别是,这包括您的 fun
和 bar
调用。
要修复它,您需要先修复设计。从您的代码示例中得出的结论,我认为您想要类似于:
void foo(double param)
{
bar(param);
}
void foo(string param)
{
fun(param);
}
看来您想调用 fun
或 bar
取决于 foo
的 param
参数。如果你使用的是 c++17,你可以使用 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;
}
foo
的和int i
参数这里不用,你根据param
类型决定调用哪个fun
/bar
。
我正在尝试从成员模板函数调用成员函数,但是它 抱怨成员函数没有重载。我如何解决它? 下面是测试代码。
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;
}
error: no matching function for call to 'Test::fun(double&)'
对于给定的类型typename T
,只有当函数体中的每个语句都有效时,函数模板才能被实例化。特别是,这包括您的 fun
和 bar
调用。
要修复它,您需要先修复设计。从您的代码示例中得出的结论,我认为您想要类似于:
void foo(double param)
{
bar(param);
}
void foo(string param)
{
fun(param);
}
看来您想调用 fun
或 bar
取决于 foo
的 param
参数。如果你使用的是 c++17,你可以使用 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;
}
foo
的和int i
参数这里不用,你根据param
类型决定调用哪个fun
/bar
。