Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么C++;函数模板代码未编译? 我搜索过网络,但我找不到问题的答案>为什么C++模板代码不编译?删除return语句前的最后一行后,它将按预期编译和运行_C++_Function_Templates - Fatal编程技术网

为什么C++;函数模板代码未编译? 我搜索过网络,但我找不到问题的答案>为什么C++模板代码不编译?删除return语句前的最后一行后,它将按预期编译和运行

为什么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

我使用的是g++版本4.3.4。我将非常感谢专家的帮助

问候,, 麦加

#包括
#包括
#包括
#包括
#包括
无效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);
}
编译器将根据