首页 > 解决方案 > 模板函数的指针输入问题 - 可能是“程序员错误”

问题描述

我正在尝试编写几个模板函数,它们在任何数据类型(在合理范围内)的值之间来回转换为字符串。这个想法是(最终)将值存储在 .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);
}

标签: c++pointerstemplates

解决方案


这里

template<typename T>
void buildabin(char*& X, T x)
{
    X = (char*)&x;
}

您正在尝试设置对函数参数地址的引用,这会给您留下悬空指针。你可能想要void buildabin(char*& X, T& x). 但是,我不知道您实际想要实现什么,所以这个答案有点机械。


推荐阅读