为什么C++;函数模板代码未编译? 我搜索过网络,但我找不到问题的答案>为什么C++模板代码不编译?删除return语句前的最后一行后,它将按预期编译和运行
我使用的是g++版本4.3.4。我将非常感谢专家的帮助 问候,, 麦加为什么C++;函数模板代码未编译? 我搜索过网络,但我找不到问题的答案>为什么C++模板代码不编译?删除return语句前的最后一行后,它将按预期编译和运行,c++,function,templates,C++,Function,Templates,我使用的是g++版本4.3.4。我将非常感谢专家的帮助 问候,, 麦加 #包括 #包括 #包括 #包括 #包括 无效mult(内部*ptr) { std::cout您必须指定要应用哪个multi-ndirect: applyIndirect(multIndirect<int>, &y); 您必须指定要应用间接的multIndirect: applyIndirect(multIndirect<int>, &y); 您必须指定要应用间接的multIndir
#包括
#包括
#包括
#包括
#包括
无效mult(内部*ptr)
{
std::cout您必须指定要应用哪个multi-ndirect
:
applyIndirect(multIndirect<int>, &y);
您必须指定要应用间接的multIndirect
:
applyIndirect(multIndirect<int>, &y);
您必须指定要应用间接的multIndirect
:
applyIndirect(multIndirect<int>, &y);
您必须指定要应用间接的multIndirect
:
applyIndirect(multIndirect<int>, &y);
您希望编译器如何从该调用中推断出applyIndirect
的模板参数Func
的实际值,从而推断出multi-ndirect
的模板参数T
applyIndirect(multIndirect, &y);
?
在这个调用中,multi-ndirect
的T
可以是double
或char
或SomeOtherType
或任何其他类型。您将Func
参数设置为完全自由的类型,并且您向编译器提供了绝对无法确定它应该是什么类型的方法。这就是导致er的原因罗
根据您对applyIndirect
的声明,要使其编译,您必须明确地告诉编译器multIndirect
中T
的值
applyIndirect(multIndirect<int>, &y);
applyIndirect<void (int *)>(multIndirect, &y);
知道Func
的值后,编译器将能够计算出multIndirect
的T
应该是什么
但是,看看你的applyIndirect
的主体,你似乎想使用funcPtr
和T*
类型的参数x
。这意味着funcPtr
的类型实际上不应该是自由类型。它实际上应该依赖于T
。你为什么要让它成为自由类型n?为什么要引入额外的模板参数Func
?其目的是什么
与其引入额外的模板参数,不如简单地将applyIndirect
声明为
template <typename T>
void applyIndirect(void funcPtr(T *), T *x)
{
funcPtr(x);
}
编译器将根据&y
的类型判断T
是int
。这反过来意味着funcPtr
的类型是void(int*)
。这将使它为T==int
实例化multi-ndirect
,您希望编译器如何从调用中推断applyIndirect
的模板参数Func
的实际值,从而推断multi-ndirect
的模板参数T
applyIndirect(multIndirect, &y);
?
在这个调用中,multi-ndirect
的T
可以是double
或char
或SomeOtherType
或任何其他类型。您将Func
参数设置为完全自由的类型,并且您向编译器提供了绝对无法确定它应该是什么类型的方法。这就是导致er的原因罗
根据您对applyIndirect
的声明,要使其编译,您必须明确地告诉编译器multIndirect
中T
的值
applyIndirect(multIndirect<int>, &y);
applyIndirect<void (int *)>(multIndirect, &y);
知道Func
的值后,编译器将能够计算出multIndirect
的T
应该是什么
但是,看看你的applyIndirect
的主体,你似乎想使用funcPtr
和T*
类型的参数x
。这意味着funcPtr
的类型实际上不应该是自由类型。它实际上应该依赖于T
。你为什么要让它成为自由类型n?为什么要引入额外的模板参数Func
?其目的是什么
与其引入额外的模板参数,不如简单地将applyIndirect
声明为
template <typename T>
void applyIndirect(void funcPtr(T *), T *x)
{
funcPtr(x);
}
编译器将根据&y
的类型判断T
是int
。这反过来意味着funcPtr
的类型是void(int*)
。这将使它为T==int
实例化multi-ndirect
,您希望编译器如何从调用中推断applyIndirect
的模板参数Func
的实际值,从而推断multi-ndirect
的模板参数T
applyIndirect(multIndirect, &y);
?
在这个调用中,multi-ndirect
的T
可以是double
或char
或SomeOtherType
或任何其他类型。您将Func
参数设置为完全自由的类型,并且您向编译器提供了绝对无法确定它应该是什么类型的方法。这就是导致er的原因罗
根据您对applyIndirect
的声明,要使其编译,您必须明确地告诉编译器multIndirect
中T
的值
applyIndirect(multIndirect<int>, &y);
applyIndirect<void (int *)>(multIndirect, &y);
知道Func
的值后,编译器将能够计算出multIndirect
的T
应该是什么
但是,看看你的applyIndirect
的主体,你似乎想使用funcPtr
和T*
类型的参数x
。这意味着funcPtr
的类型实际上不应该是自由类型。它实际上应该依赖于T
。你为什么要让它成为自由类型n?为什么要引入额外的模板参数Func
?其目的是什么
与其引入额外的模板参数,不如简单地将applyIndirect
声明为
template <typename T>
void applyIndirect(void funcPtr(T *), T *x)
{
funcPtr(x);
}
编译器将根据