所以我试图在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;
}
提前致谢。
答案 0 :(得分:0)
一个函数不能有两个return
语句,每个语句都有不同的类型,除非每个语句都有一个有效的函数转换类型。
例如:
int foo (bool flag) {
if (flag) return "hi";
return -1;
}
第一个return
无效。您的模板功能有类似的问题。对于tempalte函数的任何给定实例化,至少有一个其他返回值存在转换问题。
解决此问题的一种方法是使用某种自定义结果对象,可以通过您尝试返回的三种类型中的任何一种进行初始化。
解决此问题的另一种方法是为每种返回类型专门化模板,以便每个实例仅返回单个有效类型。
答案 1 :(得分:0)
您有多个返回路径,返回不同的类型。您需要使用模板重载,类似于:
template <typename tn>
tn GetClipboardContents();
template <>
double GetClipboardContents<double>()
{
// Add double implementation here
}
template <>
int GetClipboardContents<int>()
{
// Add int implementation here
}
重复其他类型