【问题标题】:c++ template member function with partial spezialisation outside classc ++模板成员函数,在类外具有部分特殊化
【发布时间】:2021-02-17 20:19:00
【问题描述】:

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

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

这似乎不起作用

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

【问题讨论】:

  • 无法复制。

标签: c++ templates partial-specialization


【解决方案1】:

在类外为 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) {}

【讨论】:

  • 这是对的,但是对于像模板 void::get(int) 这样的函数,您可以完全在外部定义它,而无需在类中提及它。没有 std::vector
  • @Markus 我不确定我是否完全明白。 this是你想要的吗?
  • 感谢示例,但​​这仍然声明了类中的特殊获取。考虑一个想要为 std::set 添加新的“get”函数的外部用户......所以在你的示例中,我必须在结构“c”中添加所有可能的调用
  • @Markus 好的,我认为它开始陷入困境。抱歉,我发烧了 :) 不幸的是,我认为不可能对来自 @987654324 的任何 std::vector 进行部分专业化@
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-15
  • 2015-03-04
  • 1970-01-01
  • 2013-02-28
  • 2013-09-24
  • 1970-01-01
相关资源
最近更新 更多