c++ - 模板函数的指针输入问题 - 可能是“程序员错误”
问题描述
我正在尝试编写几个模板函数,它们在任何数据类型(在合理范围内)的值之间来回转换为字符串。这个想法是(最终)将值存储在 .bin 文件中,并且还能够从所述 .bin 文件中恢复值。但是,我需要首先正确地获取转换函数。最初,我写了一个玩具函数,它看起来像这样:
template<typename T>
void buildabin(T x)
{
char* X;
T x_;
X = (char*)&x;
memcpy(&x_, X, sizeof(T));
cout<<x_<<endl;
}
这似乎工作正常。但是,当我尝试将这两种功能分开时,使用:
template<typename T>
void buildabin(char*& X, T x)
{
X = (char*)&x;
}
和:
template<typename T>
void buildaT(char* X, T& x)
{
memcpy(&x, X, sizeof(T));
}
似乎它正在正确地转换为二进制字符串,但是,在输入“buildaT”时,它会发出错误的声音 - 在不同的地方为 X 放置了一些 couts 之后,出于某种奇怪的原因,它甚至没有得到X 正确。当然,“小” x 只会返回垃圾。
我已经尝试了所有可以让它发挥作用的方案。就“buildaT”函数中的输入而言,这似乎是我的“用户错误”,但我对错误所在的位置感到困惑。
这是主要的,如果有帮助的话:
int main()
{
//char* G = new char[sizeof(double)]; //(tried this also)
char* G = NULL;
double g;
cin>>g;
buildabin<double>(G, g);
double g_;
buildaT<double>(G, g_);
cout<<g_<<endl;
return(0);
}
解决方案
这里
template<typename T>
void buildabin(char*& X, T x)
{
X = (char*)&x;
}
您正在尝试设置对函数参数地址的引用,这会给您留下悬空指针。你可能想要void buildabin(char*& X, T& x)
. 但是,我不知道您实际想要实现什么,所以这个答案有点机械。
推荐阅读
- xamarin - Xamarin UI 测试 - 预装的 apk
- windows-installer - DutchWorkz MSI 构建 VS Installers 插件无法看到 VS2019
- python - 我需要在 Python 中为以下方法编写 utest
- r - R 和 PMML xgboost 概率输出之间的最小差异
- nginx - 当 URL 以斜杠结尾时 NGINX 重写规则不起作用
- java - 在 spring-boot 中使用 @EnableWebFluxSecurity 时出错
- ios - iOS SAMKeychain 冲突。App Store 版本和 Xcode 版本中的密码不匹配
- python - 如何使用 lambda one liner 或类似方法以更少的行重写 Python 代码?
- symfony - setController() 必须是字符串类型
- php - Drupal 8 更新自定义模块的 language.po 文件