我已经声明了一个返回参数化模板类auto类型的函数shared_ptr。就我而言,如果我添加“ else”条件,编译器会抱怨类型不完整。使用相同的功能签名,可以在一种情况下正常工作。任何使编译器满意的优雅解决方案。
auto getCustomerDataSource(ptree const &node){
const auto dataSource = node.get<std::string>("<xmlattr>.Type");
const auto sourceString = node.get<std::string>("SourceString");
if (dataSource == "File") {
return std::make_shared<CustomerData<CFileSource>>(sourceString);
} else if (dataSource == "DataBase") {
return std::make_shared<CustomerData<CDatabaseSource>>(sourceString);
}
}
Run Code Online (Sandbox Code Playgroud)
Dan*_*ica 14
您的代码违反了C ++标准[dcl.spec.auto.8]中的以下规则:
如果具有声明的返回类型且包含占位符类型的函数具有多个未丢弃的
return语句,则为每个此类return语句推导返回类型。如果推导的类型在每次推导中都不相同,则程序格式错误。
CFileSource&CDatabaseSource是用户可以选择一种构建CustomerData对象的两种可能算法。
问题是您试图对运行时确定的内容使用静态多态性(模板)。因此,更好的解决方案是为您的算法提供具有共同基础的多态类。然后,您可以将一个指向base的指针作为的成员变量CustomerData,该指针不再是模板。
当auto使用时,对于程序可能采用的每个可能路径,该函数的推导返回类型必须相同。在这里,您的函数具有3种可能的返回类型:
if主体被执行:std::shared_ptr<CustomerData<CFileSource>> if主体被执行:std::shared_ptr<CustomerData<CDatabaseSoruce>> void 这是无效的。