尝试在模板 c++ 中返回变量时出错

Errors when trying to return variables in template c++

本文关键字:返回 变量 出错 c++      更新时间:2023-10-16

所以我试图在Windows中获取剪贴板的内容,因为它可以是任何类型,我使用模板来获取它,但是在尝试构建时,Visual Studio 2013 RC发送此错误:

Error   1   error C2440: 'return' : cannot convert from 'char *' to 'double'
Error   2   error C2440: 'return' : cannot convert from 'double' to 'char *'    
Error   3   error C2440: 'return' : cannot convert from 'int' to 'char *'   
Warning 4   warning C4244: 'return' : conversion from 'double' to 'int', possible loss of data    
Error   5   error C2440: 'return' : cannot convert from 'char *' to 'int'

这是代码:

template<typename tn>
tn GetClipboardContents()
{
    HANDLE h_clip;
    double d_clip;
    int i_clip;
    char* str_clip;
    if (OpenClipboard(NULL))
    {
        h_clip = GetClipboardData(CF_TEXT);
        if (typeid(tn).name() == "double")
        {
            d_clip = atof((char*)h_clip);
        }else if (typeid(tn).name() == "int"){
            i_clip = atoi((char*)h_clip);
        }else{
            str_clip = (char*)h_clip;
        }
        CloseClipboard();
    }
    if (typeid(tn).name() == "double")
        return d_clip;
    else if (typeid(tn).name() == "int")
        return i_clip;
    else
        return str_clip;
}

提前谢谢。

您有多个返回路径,这些路径返回不同的类型。您需要使用模板重载,类似于:

template <typename tn>
tn GetClipboardContents();

template <>
double GetClipboardContents<double>()
{
    // Add double implementation here
}
template <>
int GetClipboardContents<int>()
{
    // Add int implementation here
}

对其他类型重复此操作

一个函数不能有两个 return 语句,每个语句都有不同的类型,除非每个语句都与函数的返回类型有有效的收敛。

例如:

int foo (bool flag) {
    if (flag) return "hi";
    return -1;
}

第一个return无效。您的模板函数也有类似的问题。对于 tempalte 函数的任何给定实例化,至少有一个其他返回值存在转换问题。

解决此问题的一种方法是使用某种自定义结果对象,该对象可以由您尝试返回的三种类型中的任何一种初始化。

解决此问题的另一种方法是针对每个返回类型专用化模板,以便每个实例仅返回单个有效类型。