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

kaf*_*man 5 c++ methods templates

我在名为'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;
}
}
Run Code Online (Sandbox Code Playgroud)

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

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

tImage<T> convolve(const gravis::tImage<T>& image, const gravis::tArray<typename tImageTraits<T>::Float_t>& kernel);
Run Code Online (Sandbox Code Playgroud)

我该如何调用此功能?

And*_*owl 6

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

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

对方法卷积的调用将不起作用,即使in确实拥有这样的方法.

convolve()是一个非const成员函数,您试图通过引用来调用它const.这是非法的,编译器告诉你.


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

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