【问题标题】:C++ cannot call method (with template) from within templated methodC++ 无法从模板化方法中调用方法(使用模板)
【发布时间】:2013-03-07 09:15:41
【问题描述】:

我在名为“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 确实拥有这样的方法。这是tImage&lt;T&gt;类中方法convolve的定义:

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

我该如何调用这个函数?

【问题讨论】:

  • inconst 参数,因此不能在其上调用非const 成员函数。
  • binomial 似乎认为convolve 是函数模板,但convolve 看起来不像函数模板(只是模板类的成员函数)。
  • 为什么你的代码在namespace std?添加到 std 命名空间(除了特化)是非法的。

标签: c++ templates methods


【解决方案1】:

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

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

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

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


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

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

【讨论】:

  • 谢谢!我调用了命名空间std,因为这个特定问题没有另一个名字......但是,我仍然没有意识到我不能命名我自己的命名空间std,所以无论如何感谢你.
【解决方案2】:

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

this questionthis one

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-18
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多