c++ - 为什么模板函数的Template在Visual C++中无效

标签 c++ templates

我发现在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/

相关文章:

c++ - 2D 全局数组错误 - 数组界限不是整数常量

c++ - 如何在 Visual Studio (C++) 中设置发布分析

C++ vector 下标超出范围omp锁

c++ - 如果不使用模板类中的定义,是否应该实例化?

c++ - 从 C++ 模板参数包编译时间数组

c++ - 调用线程会在 thread.join() 之后看到对局部变量的修改吗?

c++ - 如何在文本编辑器中处理[-Wc++11-extensions]

c++ - 从类内部获取模板

c++ - 是否可以在另一个模板参数的模板参数中声明模板参数?

django - 使用django为手机和PC建立网站