以下代码在指定点有什么问题?我想根据文件中某处读取的程序返回整数或字符或字符串列表。我尝试下面的代码,但它会引发我的错误。你可以看到我对模板有点弱。
template <class T>
std::list<T> function1(int type)
{
using namespace std;
if (1 == type)
return list<int>(3, 100); / No error
else if (2 == type){
list<wchar_t> temp;
temp.push_back(L'a'); // C2664 error here
return temp;
}else if (3 == type){
list<wstring> temp;
temp.push_back(L"a"); // C2664 error here
return temp;
}else
return nullptr; // C2664 error here
}
我已经指出了“visual studio 2013社区版更新4”抛出编译器错误C2664的要点。我怎么能这样写,我可以根据里面的处理得到列表?其中一个错误如下。
Error 1 error C2664: 'std::list<int,std::allocator<_Ty>>::list(std::initializer_list<_Ty>,const std::allocator<_Ty> &)' : cannot convert argument 1 from 'std::list<wchar_t,std::allocator<wchar_t>>' to 'const std::list<int,std::allocator<_Ty>> &'
答案 0 :(得分:1)
这是不可能的,模板需要在编译时解决,但type
的值在那里是未知的。您需要使用一些间接,例如boost::variant
或非模板化接口。或者更确切地说,采用完全不同的方法。
答案 1 :(得分:0)
换句话说:模板本身不包含足够的信息来进行编译。您需要通过在使用模板时提供模板参数来实例化它;编译器不能决定稍后弄清楚它的参数(或者它可能涉及一些即时编译)。我不认为你可以使用专门化来解决这个问题,因为返回类型不兼容。 (对不起,我写了一个新答案......我还没有权利发表评论......)
很难确定list
中对象的类型然后返回它或指向它的指针,以便您可以在调用function1
的函数中使用它。您可以考虑重构代码。如果可能,您可以尝试从函数中调用进一步处理的其他函数。
如果你坚持从function1
返回列表:我能想到的一个想法是创建一个包含指向列表的 JK。 (这肯定会造成它解决的麻烦。)void*
指针的包装类(动态分配) ,以及告诉你类型的东西(比如,int type
)。但其他功能可能必须遵循这种模式。
答案 2 :(得分:-1)
对于任何特定类型的函数模板的任何实例化,至少有一个文字可能与该类型不兼容。
您可以使用某些traits类的特化,它提供各种受支持类型的值。这样可以轻松支持新类型。或者您可以为各种支持的类型使用函数的重载。