Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板类中的模板成员专门化 #包括 #包括 模板 结构A { 模板自动函数(); 模板自动函数(); }; 模板 模板 汽车 A::func(){return std::string{“foo”};} int main() { A{}; std::如果我们查看n4810§13.8.3 一个成员函数,一个成员函数模板,一个成员类,一个 成员枚举、成员类模板、静态数据成员或 类模板的静态数据成员模板可以显式 为隐式的类专门化而专门化 实例化;在这种情况下,类模板的定义应 在类成员的显式专门化之前 如果类成员的这种显式专门化 模板命名隐式声明的特殊成员函数 (11.3.3),程序格式不正确_C++_Templates - Fatal编程技术网

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
    };