c ++模板成员函数,在类外进行部分特殊化

问题描述

代码使用一个模板成员,该成员对 std::vector 和其他类型的工作方式不同。到目前为止它工作正常。但是在类外为 std::vector 定义 get 方法的正确语法是什么?我知道使用特性和其他帮助程序来实现这一点,但如果有有效的语法,我想要这个简单的解决方案。

#include <iostream>
#include <vector>

using namespace std;

struct s
{
  template < class X > void get (X x)
  { 
      cout << "inner\n";
  };
  
  template <class X> void get(std::vector<X> vec)
  {
      cout << "inline any vector\n";
  }

};

int main ()
{
  std::vector < int >vec;
  std::vector< double> dvec;
  s x;
  x.get (1);
  x.get (vec);
  x.get(dvec);
  return 0;
}

这似乎不起作用

#include <iostream> #include <vector> using namespace std; struct s { template < class X > void get (X x) { cout << "inner\n"; }; template <class X> void get(std::vector<X> vec) { cout << "inline any vector\n"; } }; int main () { std::vector < int >vec; std::vector< double> dvec; s x; x.get (1); x.get (vec); x.get(dvec); return 0; }

解决方法

在类外为 std::vector 定义 get 方法的正确语法是什么?

那只是在类模板中声明它,然后继续在外部定义它:

struct s {
    template < class X > 
    void get (X x) { 
        cout << "inner\n";
    }

    template <class X>            // declaration
    void get(std::vector<X> v);
};

template <class X>                // definition
void s::get(std::vector<X> v) {}