矢量类型的模板类专业化 - 不同的有效语法?

Posted

技术标签:

【中文标题】矢量类型的模板类专业化 - 不同的有效语法?【英文标题】:Template class specialization for vector type - different valid syntax? 【发布时间】:2015-10-02 16:41:30 【问题描述】:

在下面的代码片段中,template<> 对于专业化来说是可选的吗?我是否包含它有什么区别吗?我的第一个直觉是把它包括在内,因为它或多或少意味着它是一种专业化。它可以在 g++ 4.9.2 和 Intel 16 下双向编译

#include <vector>
#include <iostream>

template<typename T>
struct PrintMe

    static void Print(const T & t)
    
        std::cout << "In general templated struct: " << t << "\n";
       
;      


template<> // <--- optional?
template<typename T>
struct PrintMe<std::vector<T>>
   
    static void Print(const std::vector<T> & t)
       
        std::cout << "In general specialization for vector: " << t.size() << "\n";
        for(const auto & it : t)
            std::cout << "        " << it << "\n";
    

;


int main(void)
   
    PrintMe<int>::Print(5);   
    PrintMe<double>::Print(5);    
    PrintMe<std::vector<float>>::Print(10,20,30,40);

    return 0;

注意:出于好奇,我尝试添加多个template&lt;&gt;。即,

template<>
template<>
template<>
template<typename T>
struct PrintMe<std::vector<T>>

这仍然可以使用 Intel 编译,但不能使用 g++。不知道这意味着什么,但很有趣。

注 2:哇,这与我 5 年前的一个问题非常相似:Templated class specialization where template argument is a template。在那里它被称为冗余语法。

【问题讨论】:

【参考方案1】:

给定类模板的定义,

template<> // <--- optional?
template<typename T>
struct PrintMe<std::vector<T>>  ... ;

无效。

您需要删除该行并使用:

template<typename T>
struct PrintMe<std::vector<T>>  ... ;

【讨论】:

【参考方案2】:

有一些方法可以查看模板和模板专业化,它们将描绘出更好的画面并使整个事情更清晰。 对我来说,在这种情况下,更简单的方法是不去想

template<typename T>
struct PrintMe<std::vector<T>>  ... ;

专业化

template<typename T>
struct PrintMe  ... ;

但是作为一个完全不同的类模板,只是碰巧这两者有相似的命名方法。

【讨论】:

我也是这么想的。它似乎类似于函数模板专业化与重载参数。但是在那种情况下,有一些关于分辨率等的重要细节。也许这里不是这种情况?打印出 typeid() 表明它们具有相同的损坏名称 这里和每个模板都是这种情况,模板专业化基本上是你告诉编译器“不要使用其他植入,使用我在这里给你的这个。”不知道你为什么说它们有相同的重命名,它们是运行时的两个不同的类并且具有不同的名称。

以上是关于矢量类型的模板类专业化 - 不同的有效语法?的主要内容,如果未能解决你的问题,请参考以下文章

BST模板类中使用的矢量模板类

如何为矢量专门化一个类模板?

类型和函数的模板类特化添加

模板嵌套类方法的单独定义的正确语法

模板专业化,Windows 与 gcc 上的不同行为?

泛函编程—模板函数_类模板