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

时间:2015-10-02 16:41:30

标签: c++ templates syntax

在下面的snippit中,专业化的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<>。即,

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

这仍然适用于英特尔,但不适用于g ++。不确定这意味着什么,但它很有趣。

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

2 个答案:

答案 0 :(得分:2)

鉴于类模板的定义,

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

无效。

您需要删除该行并使用:

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

答案 1 :(得分:0)

有一些方法可以查看模板和模板专业化,从而绘制出更好的画面并使整个事情更加清晰。 对我来说,在这种情况下,更容易看到这一点是不要想到

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

作为

的专业化
template<typename T>
struct PrintMe { ... };

但是作为一个完全不同的类模板,它恰好是两个具有类似名称的方法。