我安装了CTP-Nov2013-Compiler,以熟悉/试验VS 2013的一些C ++ 14功能(通过实践/阅读学习)。 我尝试了类似于任何POD类型转换器的字符串,而没有使用因错误而失败的泛型方法(因为今天我以某种方式使Visual Studio崩溃,每当我尝试构建程序时都无法拼写正确的错误[CTP bug?] )'返回类型不是第一种返回类型'。
问题的一个例子:
#include <iostream>
using namespace std;
enum EType{
eInt,
eBool,
eFloat,
eString
}
class Test
{
Test();
virtual ~Test(){}
decltype(auto) SomeMethod(std::string texttoconvert, EType type)
{
switch(type)
{
//convert to the specific type by using the C++11 stoi* functions and return it (for the example I'm not checking for failure in the conversion)
case eInt: return std::stoi(texttoconvert);
break;
case eFloat: return std::stof(texttoconvert);
break;
...
default:
break;
}
}
int main()
{
Test hugo;
auto lAuto=hugo.SomeMethod("1.234", eFloat);
cout<<lAuto<<endl; //should return a float
return 0;
}
所以问题是,逻辑类的错误(除了不使用try-catch-blocks进行std::sto*
转换)或是语法错误?
我遇到的另一个问题是我必须在头文件中实现该方法(否则我得到了一个错误)而不是在.cpp文件中,这是一个想要/必要的功能,比如模板函数吗?
答案 0 :(得分:2)
它的语义错误。 auto
返回类型表示该方法已自动推导出返回类型,但类型仍然是整个方法的类型,它不能根据调用的return
表达式进行更改。此外,C ++ 14要求所有return
表达式返回相同的类型,并禁止在这种情况下进行隐式转换。
答案 1 :(得分:0)
您需要将编译时信息作为模板参数传递。
类型确定信息必须是编译时信息。
enum EType{
eInt,
eBool,
eFloat,
eString
};
template<EType type>
decltype(auto) convert(std::string texttoconvert);
template<>
decltype(auto) convert<eInt>(std::string texttoconvert) {
return std::stoi(texttoconvert);
}
template<>
decltype(auto) convert<eFloat>(std::string texttoconvert) {
return std::stof(texttoconvert);
}
struct Test {
template<EType type>
decltype(auto) SomeMethod(std::string texttoconvert) {
return convert<type>(texttoconvert);
}
};
int main() {
Test t;
float f = t.SomeMethod<eFloat>("3.14");
std::cout << f << "\n";
}