问一个关于类模板的有关问题,对C++的类string的迷惑

问一个关于类模板的问题,对C++的类string的迷惑
定义一个string s;
然后go to definition,最后可以看到下面代码(我删减过,只保留关键代码)
C/C++ code

template<class _E>
        struct char_traits {
    ...
    };


template<> struct char_traits<char> {
    ...
    };


第一段的内容课本上学过,能看懂,但是第二段完全搞不清楚,没有这种语法。
template<>这是干什么,模板类里没有类型?
template<> struct char_traits<char> : 其中char_traits<char>,怎么<char>这种类型跑到类名称里面去了,而不在template<>里?

------解决方案--------------------
当调用模板给定类型参数是char的时候,调用第二个模板;其他的调用第一个模板

类似函数的重载,函数名一样,参数不一样;这里是模板名一样,模板参数不一样