C ++不能在模板化方法中调用方法(带模板)

时间:2013-03-18 21:05:33

标签: c++ templates methods

我在名为'filter.h'的头文件中有以下方法:

namespace std{

//some code

template <class T, class S, class BorderMethod>
tImage<T> binomial(const tImage<T> &in, const size_t k = 3) {
   //do some computations

  tImage<T> img = in.convolve<T, BorderMethod>(in, kernel);
  return img;
}
}

我注意到的第一件事:此方法的定义发生在header-file中。这是标准程序吗?

现在,实际问题:即使convolve确实拥有这样的方法,对方法in的调用也不起作用。以下是类convolve中方法tImage<T>的定义:

tImage<T> convolve(const gravis::tImage<T>& image, const gravis::tArray<typename tImageTraits<T>::Float_t>& kernel);

我如何调用此功能?

2 个答案:

答案 0 :(得分:6)

  

我注意到的第一件事:此方法的定义发生在header-file中。这是标准程序吗?

是。通常,函数模板的定义放在标题中。如果它们被降级到单独的.cpp文件中,则编译器在调用时将无法隐式实例化它们,除非您采取适当的操作,否则将导致链接器抱怨未定义的引用。有关详细信息,请参阅this Q&A on StackOverflow

  

对方法convolve的调用不起作用,即使in确实拥有这样的方法。

convolve()是非const成员函数,您尝试通过对const的引用来调用它。这是非法的,编译器会告诉你。


此外,正如JBentley在其答案中正确指出的那样,您无法向std命名空间添加新的声明或定义。根据C ++ 11标准的第17.6.4.2.1 / 1段:

  

如果C ++程序向名称空间std或a添加声明或定义,则它的行为是未定义的   除非另有说明,否则命名空间std中的命[...]

答案 1 :(得分:2)

虽然不是您的问题的原因,但您的代码具有未定义的行为,因为您已将其非法放置在std命名空间内。

请参阅this questionthis one