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++; 在用模板编码C++时,我遇到了3个问题。VS2013似乎可以编译下面的代码_C++_Templates - Fatal编程技术网

C++; 在用模板编码C++时,我遇到了3个问题。VS2013似乎可以编译下面的代码

C++; 在用模板编码C++时,我遇到了3个问题。VS2013似乎可以编译下面的代码,c++,templates,C++,Templates,代码如下: //模板测试 #包括 使用名称空间std; 模板 类mytest { 公众: 无效法(T输入); 无效公共(); }; 模板 类mytest { 公众: void方法(字符输入); 无效公共(); }; 模板 void mytest::方法(T输入) { 库特 是否可以从模板void mytest::method(T输入)中省略 不需要。虽然在简单的情况下它似乎是多余的,但在更复杂的情况下,例如,当存在多个局部专门化时,它就变得很有必要。保持语法一致也很有帮助 当将完全专用类模板的成

代码如下:

//模板测试

#包括
使用名称空间std;
模板
类mytest
{
公众:
无效法(T输入);
无效公共();
};
模板
类mytest
{
公众:
void方法(字符输入);
无效公共();
};
模板
void mytest::方法(T输入)
{
库特
  • 是否可以从
    模板void mytest::method(T输入)
    中省略

    不需要。虽然在简单的情况下它似乎是多余的,但在更复杂的情况下,例如,当存在多个局部专门化时,它就变得很有必要。保持语法一致也很有帮助

  • 当将完全专用类模板的成员函数的定义放入头中时,会出现“the”错误(我假设您得到了多个声明的符号)

    完全专用类模板的成员函数被视为非类模板的成员函数:只有一个版本,编译器永远不需要隐式实例化它。因此,函数不是隐式内联的,就像任何函数模板一样,可能需要在如果要将定义放入头中,则需要显式地将其声明为
    inline

  • 如何在类模板及其专用化之间共享函数

    除了语法之外,类模板及其任何专门化都没有共同之处。它们是完全独立的类。有两种方法可以在不同的专门化之间共享公共功能:

  • 将公共功能放入公共基类中并在其中实现逻辑。如果功能需要访问实际模板的成员,则可以使用授予基类对专用化的访问权限
  • 不要将公共功能设置为成员函数,而是将其设置为接受任何专门化的函数模板
  • 根据您的通用功能需要做什么,一种或另一种方法工作得更好


    Dietmar Kühl对1的回答的一点补充。感受不同:

    • 非专业类模板方法的实现
      模板类mytest

      template <class T>
      void mytest<T>::method(T input)
      {
          // ...
          // use of input
      }
      
      模板
      void mytest::方法(T输入)
      {
      // ...
      //输入的使用
      }
      
    • 对于指向对象的指针,部分类模板专门化方法的实现
      模板类mytest

      template <class T>
      void mytest<T*>::method(T* input)
      {
          // ...
          // use of *input
      }
      
      模板
      void mytest::方法(T*输入)
      {
      // ...
      //*输入的使用
      }
      
    • 针对指向另一类数据成员的指针,实现部分类模板专用化
      模板类mytest

      template <class U, class V>
      void mytest<U V::*>::method(V& object, U V::* input)
      {
          // ...
          // use of object.*input
      }
      
      模板
      void mytest::方法(V&object,U V::*输入)
      {
      // ...
      //对象的使用。*输入
      }
      
    • 全类模板专门化方法的实现
      模板类mytest

      template <class T>
      void mytest<T>::method(T input)
      {
          // ...
          // use of input
      }
      
      void mytest::方法(字符输入)
      {
      // ...
      //输入的使用
      }
      
    • 非专用类模板的完全专用方法的实现
      模板类mytest

      template <class T>
      void mytest<T>::method(T input)
      {
          // ...
          // use of input
      }
      
      模板
      void mytest::方法(int输入)
      {
      // ...
      //输入的使用
      }
      

    “但是为什么专门化模板类的声明和实现应该在不同的代码文件中?”显式(完全)专门化类模板的成员函数只是函数,也就是说,ODR对它们的应用与对任何其他(成员)的应用一样函数:如果不是
    内联的,程序中必须只有一个定义。如果要显式地专门化类模板的某些成员函数,有第三种方法,例如
    template struct mytest{void common(){/*…*/}void special(){/*…*/};template void mytest::special(){/*…*/};template void mytest::special(){/*…*/}
    template <class T>
    void mytest<T>::method(T input)
    {
        // ...
        // use of input
    }
    
    template <class T>
    void mytest<T*>::method(T* input)
    {
        // ...
        // use of *input
    }
    
    template <class U, class V>
    void mytest<U V::*>::method(V& object, U V::* input)
    {
        // ...
        // use of object.*input
    }
    
    void mytest<char>::method(char input)
    {
        // ...
        // use of input
    }
    
    template <>
    void mytest<int>::method(int input)
    {
        // ...
        // use of input
    }