我在名为'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);
我如何调用此功能?
答案 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
命名空间内。