在类模板中创建模板函数对象

时间:2018-03-09 19:43:38

标签: c++ class templates

在我之前的问题I was enquiring about the argument type of a class template in other class template中。

简而言之,在类I中,可以通过创建对象并调用它来调用成员函数,也可以通过直接使用范围解析运算符来调用成员函数。 现在,我想在以下2个类模板中使用它。 第一类模板是:

template<typename T>
class Point {
  public:
      //constructor
      Point () { }

      //initialise the vector 
      Point(std::vector<T> &vector);

      //deconstructor
      ~Point () { }

      //to calculate distance between two points
      T distance(const Point &p1, const point &p2);

      //members
      std::vector<T> data_points;
      int dimensions;
      int name;
      };

第二类模板是:

template<typename T> 
class calculate {
public:
  bool initialise(const std::vector<Point<T>> &points);

  bool load_points(const std::string &filepath, std::vector<Point<T>> *dpt);

  const std::vector<Point<T>> &getPoints() const 
      {
        return points;
      }

  const std::vector<Point<T>> &getMeans() const 
      {
        return means;
      }

private:
  std::vector<Point<T>> means;
  std::vector<Point<T>> points;
};

以下是一段“main.cc”:

//inside int main()

int main(int argc, char *argv[])
{
...
...
std::vector<Point<double>> points;

calculate<double>::load_points(filepath, &points); //error shows in this line

for(const auto &p : points)
{
  std::cout << p << std::endl;
}
...
...
...
return 0;
}

这种方法在普通的类实现中完全正常,但是一旦我尝试将它与模板一起使用,它就会显示以下错误:

error: cannot call member function 
'bool calculate<T>::load_points(const string&, std::vector<Point<T>> *) 
[with T = double; std::__cxx11::basic_string <char>]' 
without object

为什么它适用于类但不适用于类模板?

1 个答案:

答案 0 :(得分:1)

你不能这样称呼load_points,因为它没有被宣布为static,因此你需要一个你班级的实例。

例如你可以说

calculate<double> calc;
calc.load_points(filepath, &points);