我发现在Visual C++ 2013中使用template function的模板是无效的。 首先我定义了一个模板函数指针(用于将 T 转换为字符串):
template<class T>
struct TemplateFn
{
typedef string(*T2STRING)(T);
};
然后我又定义了一个模板函数
template<class T>
vector<string> Vector2StringVector(vector<T> a_vt, TemplateFn<T>::T2STRING a_fn)
{
auto vtString = vector<string>();
for (auto i = a_vt.begin(); i != a_vt.end(); i++)
{
vtString.push_back(a_fn(*i));
}
return vtString;
}
并且编译器会输出错误:C2061 SYNTAX ERROR: IDENTIFIER 'T2STRING' 最后我只是将代码更改为以下内容:
template<class T>
vector<string> Vector2StringVector(vector<T> a_vt, string(*T2STRING)(T))
{
auto vtString = vector<string>();
for (auto i = a_vt.begin(); i != a_vt.end(); i++)
{
vtString.push_back(T2STRING(*i));
}
return vtString;
}
没关系。 所以它对我来说是如此有线。有没有一种像 TemplateFn::T2STRING 这样优雅的方式来使用这种方式? 谢谢
最佳答案
T2STRING 是依赖嵌套类型,所以你应该给编译器一个提示。将您的函数头更改为
vector<string> Vector2StringVector(vector<T> a_vt, typename TemplateFn<T>::T2STRING a_fn)
顺便说一句,你不尝试重新实现 std::transform
(使用额外的 std::back_inserter
)吗?
关于c++ - 为什么模板函数的Template在Visual C++中无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36675898/