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)
我该如何调用此功能?
我注意到的第一件事:这个方法的定义发生在header-file中.这是标准程序吗?
是.通常,函数模板的定义放在标题中.如果将它们降级为单独的.cpp文件,则编译器在调用时无法隐式实例化它们,除非您采取适当的操作,否则将导致链接器抱怨未定义的引用.有关详细信息,请参阅StackOverflow上的此问答.
对方法卷积的调用将不起作用,即使in确实拥有这样的方法.
convolve()是一个非const成员函数,您试图通过引用来调用它const.这是非法的,编译器告诉你.
此外,正如JBentley在其答案中正确指出的那样,您无法向std命名空间添加新的声明或定义.根据C++ 11标准的第17.6.4.2.1/1条:
如果C++程序向命名空间std或命名空间std中的命名空间添加声明或定义,则它是未定义的,除非另有说明.[...]
| 归档时间: |
|
| 查看次数: |
301 次 |
| 最近记录: |