C++ 模板类中的模板成员专门化 #包括 #包括 模板 结构A { 模板自动函数(); 模板自动函数(); }; 模板 模板 汽车 A::func(){return std::string{“foo”};} int main() { A{}; std::如果我们查看n4810§13.8.3 一个成员函数,一个成员函数模板,一个成员类,一个 成员枚举、成员类模板、静态数据成员或 类模板的静态数据成员模板可以显式 为隐式的类专门化而专门化 实例化;在这种情况下,类模板的定义应 在类成员的显式专门化之前 如果类成员的这种显式专门化 模板命名隐式声明的特殊成员函数 (11.3.3),程序格式不正确
但是,如果两者都是专用的,则允许您这样做:C++ 模板类中的模板成员专门化 #包括 #包括 模板 结构A { 模板自动函数(); 模板自动函数(); }; 模板 模板 汽车 A::func(){return std::string{“foo”};} int main() { A{}; std::如果我们查看n4810§13.8.3 一个成员函数,一个成员函数模板,一个成员类,一个 成员枚举、成员类模板、静态数据成员或 类模板的静态数据成员模板可以显式 为隐式的类专门化而专门化 实例化;在这种情况下,类模板的定义应 在类成员的显式专门化之前 如果类成员的这种显式专门化 模板命名隐式声明的特殊成员函数 (11.3.3),程序格式不正确,c++,templates,C++,Templates,但是,如果两者都是专用的,则允许您这样做: #include <iostream> #include <string> template<typename U> struct A { template<typename... Ts> auto func(); template<> auto func<U>() { return std::string{"foo"}; } }; int main() { A&l
#include <iostream>
#include <string>
template<typename U>
struct A
{
template<typename... Ts> auto func();
template<> auto func<U>() { return std::string{"foo"}; }
};
int main()
{
A<int> a{};
std::cout << a.func<int>() << std::endl;
}
模板
结构A
{
模板自动函数(){/*…*/}
};
模板
模板
自动A::func()
{
//好的,封闭类模板显式专用
}
虽然这是无效的c++:
template<typename U>
struct A
{
template<typename... Ts> auto func() { /* ... */ }
};
template <>
template <>
auto A<int>::func<int>()
{
// ok, enclosing class template explicitly specialized
}
模板
模板
自动A::func()
{
//ops:无效,封闭类模板未显式专用
}
根据:
因为:
template <typename U>
template <>
auto A<U>::func<int>()
{
// ops: invalid, enclosing class template not explicitly specialized
}
模板
结构A{
模板自动函数();
模板auto func(){return std::string{“foo”};}//不应工作
};
我不知道为什么叮当声允许这样做
但它允许位于声明主模板的命名空间范围内,在本例中为全局命名空间范围。这些都不应编译。模板专门化只允许在命名空间范围内声明。@Brian,当您说在命名空间上允许模板专门化时,您能详细说明一下吗scope@Kapil什么你想让我详细说明一下吗?即使我在某个名称空间中添加了这个模板声明,我也会得到同样的错误,所以当你说只允许在名称空间范围内进行模板专门化时,这意味着什么呢?这段代码可以很好地处理clang,gcc似乎存在一些问题
template<typename U>
struct A
{
template<typename... Ts> auto func() { /* ... */ }
};
template <>
template <>
auto A<int>::func<int>()
{
// ok, enclosing class template explicitly specialized
}
template <typename U>
template <>
auto A<U>::func<int>()
{
// ops: invalid, enclosing class template not explicitly specialized
}
template <typename U>
struct A {
template<typename...Ts> auto func();
template<> auto func<int>() { return std::string{"foo"}; } // should not work
};