namespace A{
namespace B{
template<typename T>
struct Test{
};
}
using namespace B;
template<>
struct Test<int>{}; //#1
}
int main(){
}
Run Code Online (Sandbox Code Playgroud)
考虑上面的代码,GCC抱怨这样的代码Clang格式错误并认为这样的代码格式良好。结果就在这里。在#1,它是类模板的显式特化声明Test。根据这个规则:
temp.expl.spec#2
可以在可以定义相应主模板的任何范围内声明显式特化。
主模板Test可以在 namespace 之外定义B,只要它遵守以下规则:
namespace.memdef#2
命名空间的成员也可以通过定义的名称的显式限定 ([namespace.qual])在该命名空间之外定义,前提是正在定义的实体已经在命名空间中声明并且定义出现在包含声明的 namespace 的命名空间。
也就是说,我们可以Test像这样定义主模板:
namespace A{
namespace B{
template<typename T>
struct Test;
}
template<typename T>
struct B::Test{ // Test is explicit qualified by B
};
}
Run Code Online (Sandbox Code Playgroud)
因此,我们可以在此时定义显式专业化。但是不清楚是否有必要通过使用qualified-id来声明这种显式专业化?但是这里有一个额外的规则: …