为什么C++函数模板代码无法编译
Why does the C++ function template code not compile?
我在网上搜索过,但我找不到问题的答案> 为什么C++模板代码无法编译?一旦我删除了 return 语句之前的最后一行,它就会按预期编译和运行。
我使用 g++ 版本 4.3.4。我将非常感谢专家的帮助。
问候迈卡
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <stdint.h>
#include <boost/lexical_cast.hpp>
void mult(int* ptr)
{
std::cout << "void mult(" << *ptr << "): line: " << __LINE__ << ", function: "<< __FUNCTION__ << std::endl;
}
template <typename T>
void multIndirect(T* x)
{
std::cout << "void mult(" << *x << "): line: " << __LINE__ << ", function: "<< __FUNCTION__ << std::endl;
}
void apply(void (*funcPtr)(int*), int* pVal)
{
std::cout << "apply(" << boost::lexical_cast<std::string>((uintptr_t) funcPtr) << ", " << *pVal << "): line:" << __LINE__ << ", function: " << __FUNCTION__ << std::endl;
funcPtr(pVal);
}
template <typename Func, typename T>
void applyIndirect(Func funcPtr, T* x)
{
std::cout << "apply(" << boost::lexical_cast<std::string>((uintptr_t) funcPtr) << ", " << *x << "): line:" << __LINE__ << ", function: " << __FUNCTION__ << std::endl;
funcPtr(x);
}
int main(void) {
int y = 300;
mult(&y);
apply(mult, &y);
apply(multIndirect, &y);
applyIndirect(multIndirect, &y);
return EXIT_SUCCESS;
}
我收到编译器错误:
CPPTemplate.cpp: In function int main():
CPPTemplate.cpp:47: error: no matching function for call to applyIndirect(<unresolved overloaded function type>, int*)
make: *** [CPPTemplate.o] Error 1
指定要间接应用哪个multIndirect<T>
:
applyIndirect(multIndirect<int>, &y);
如果使用 apply
,则无需指定类型,因为编译器推断出正确的类型:
void apply(void (*funcPtr)(int*), int* pVal);
// ^^^^^^^^^^^^^^^^^^^^^
您希望编译器如何从此调用中推断出applyIndirect
的模板参数Func
的实际值,从而推断出multIndirect
的模板参数T
applyIndirect(multIndirect, &y);
?
在这个调用中,multIndirect
的T
可以是double
或char
或SomeOtherType
或其他任何东西。你使Func
参数成为完全自由的类型,并且你为编译器提供了绝对无法确定它应该是什么类型的方法。这就是导致错误的原因。
给定你的applyIndirect
声明,要使其编译,你必须明确地告诉编译器T
的值multIndirect
applyIndirect(multIndirect<int>, &y);
现在知道了multIndirect<int>
的类型,编译器将能够弄清楚Func
应该是什么。或者,您也可以显式告诉编译器Func
的值applyIndirect
applyIndirect<void (int *)>(multIndirect, &y);
了解Func
的值,编译器将能够弄清楚multIndirect
应该是什么T
。
但是,查看applyIndirect
的主体,您似乎想将funcPtr
与类型为 T *
的参数x
一起使用。这意味着funcPtr
类型实际上不应该是自由类型。它实际上应该取决于T
.那你为什么把它变成一个免费类型呢?为什么要Func
引入额外的模板参数?这样做的目的是什么?
与其引入额外的模板参数,不如简单地将applyIndirect
声明为
template <typename T>
void applyIndirect(void funcPtr(T *), T *x)
{
funcPtr(x);
}
这将立即与宣布apply
的方式一致。
现在编译器将了解x
类型和所需funcPtr
类型之间的联系。通过这样的声明,您将能够致电
applyIndirect(multIndirect, &y);
编译器将从&y
的类型中找出T
int
。反过来,这将意味着funcPtr
的类型是 void (int *)
.这将使它实例化multIndirect
T == int
.
- 在Linux for Windows上编译C++代码时出错
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在程序中编写脚本来编写和编译代码
- 未定义的引用 .. 使用 OpenCV 编译 C++ 代码时,从命令行
- 在macos上编译代码的未解析符号
- 使用个人C++库编译代码时,与头文件一起使用时会中断
- 使用指针编译代码后,.cpp文件将变为随机字符
- VS Express 无法正确编译代码(?
- 如何在Ubuntu中使用Visual Studio代码编译C++代码
- 使用 Android NDK 使用 clang++ 编译C++代码时对"_Unwind_Resume"的未定义引用
- 无法使用两个包装不同下一层的ssl_stream编译代码
- 编译代码时"[Warning] extra tokens at end of"
- 无法编译代码,因为它已在 C++11 中弃用
- 如何在 Azure 应用服务中使用 cl.exe 编译 C++ 代码并生成可执行文件
- 如何调试编译 c++ 代码的 bazel?
- 为什么在使用转换构造函数编译代码时需要 const 复制构造函数?
- 编译 C++ 代码后尺寸较大
- 使用用 C++ 和 DDS 编写的 CMAKE 编译代码
- 编译代码时如何不制作二进制文件?
- 如何使用所有其他文件信息来编译代码,例如HAAR级联训练的权重的XML文件