为返回一对的对创建模板类

时间:2017-04-22 22:39:00

标签: c++ class templates

代码不起作用,我不确定我哪里出错了任何帮助都会非常感谢这是作业的详细信息通过编写模板来创建一个类模板这个名为"对"。此类将表示在模板定义中参数化的类型的一对数据成员。例如,你可以有一对整数,一对双精度等等。

/* so I'm trying to implement this driver this is the driver.cpp file and
 * I'm trying to do it with a template class */

int main()
{
   Pair<char> letters('a', 'd');
   cout << "\nThe first letter is: " << letters.getFirst();
   cout << "\nThe second letter is: " << letters.getSecond();

   cout << endl;
   cin.get();
}

//this is my .h file code
template <class T>
class Pair
{
   private:
      T first;
      T second;
   public:
      Pair(const T, const T);
      T getFirst();
      T getSecond();
};

//this is my Pair.cpp
#include "Pair.h"


template<class T>
Pair<T>::Pair(const T first, const T second)
{
   return first, second;
}

template<class T>
inline T Pair<T>::getFirst()
{
   return first;
}

template<class T>
inline T Pair<T>::getSecond()
{
   return second;
}

3 个答案:

答案 0 :(得分:0)

您的代码存在两个明显的问题。

首先,您只有Pair.h中成员函数的声明和单独Pair.cpp文件中的定义。虽然这适用于常规功能,但它不适用于模板(请参阅Why can templates only be implemented in the header file?),正如Guillaume Racicot在您的问题评论中已经提到的那样。

第二个问题是你的构造函数没有初始化Pair类的数据成员,而是返回传递给它的第二个参数,即使构造函数不能有返回值。 / p>

要解决此问题,您需要将构造函数的定义更改为

template <typename T>
Pair<T>::Pair(T fst, T snd)
    : first{std::move(fst)},
      second{std::move(snd)} {
}

此处不需要调用std::move,但这是将值移动到变量中的惯用方法。如果你只做first{fst},你最终会制作一个额外的副本而不是移动,这对于intfloat这样的原始类型来说并不是很重要。 ,但如果你要创建一对大对象(例如两个1000个元素向量),那么这可以产生巨大的差异。

应用这两项更改并添加include guards后,您应该最终获得一个Pair.h文件

#ifndef PAIR_H
#define PAIR_H

template <class T>
class Pair
{
   private:
      T first;
      T second;
   public:
      Pair(T, T);
      T getFirst();
      T getSecond();
};

template<class T>
Pair<T>::Pair(T fst, T snd)
    : first{std::move(fst)},
      second{std::move(snd)}
{
}

template<class T>
T Pair<T>::getFirst()
{
   return first;
}

template<class T>
T Pair<T>::getSecond()
{
   return second;
}
#endif

答案 1 :(得分:-1)

这里是简单的pair.h模板

animation: {
  onComplete: function(animation) {
    if (!img) {
      ctx.setAttribute('href', this.toBase64Image());
      img = new Image;
      img.src = ctx.getAttribute('href');
      ctx.insertAdjacentHTML("afterend", img.outerHTML)
    }
  }
}  

答案 2 :(得分:-1)

构造函数不应返回任何内容。它的功能是通过作为参数传递的变量初始化对象。

template<class T>
Pair<T>::Pair(const T fst, const T scd) : first(fst), second(scd)
{}