5

我在名为“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;
}
}

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

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

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

我该如何调用这个函数?

4

2 回答 2

6

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

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

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

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


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

如果 C++ 程序将声明或定义添加到命名空间 std 或命名空间 std 内的命名空间,则 C++ 程序的行为是未定义的,除非另有说明。[...]

于 2013-03-18T21:09:11.830 回答
3

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

看到这个问题这个问题。

于 2013-03-18T21:15:16.007 回答