1

所以我试图在 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;
}

提前致谢。

4

2 回答 2

0

一个函数不能有两个return语句,每个语句都有不同的类型,除非每个语句都有效地转换为函数的返回类型。

例如:

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

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

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

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

于 2013-10-07T03:34:53.393 回答
0

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

template <typename tn>
tn GetClipboardContents();


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

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

重复其他类型

于 2013-10-07T03:37:10.420 回答