相关疑难解决方法(0)

822
推荐指数
10
解决办法
35万
查看次数

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

我在名为'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)

我该如何调用此功能?

c++ methods templates

5
推荐指数
1
解决办法
301
查看次数

在std命名空间中添加模板特化

背景:
我试图回答这个问题为什么我的重载<运算符不能用于STL排序.我的一个建议(除了使用谓词)是在命名空间std中移动自定义operator <,std::string以便编译器可以优先于模板化版本.

以惊人的速度回答了一个高度知名的用户的评论:

这是未定义的行为,不允许向namespace std添加声明,因为它可以更改标准库componens的行为

我的问题:
是否可以为stl类型添加模板特化,即使此特化的声明不包含用户定义的数据类型?


ps我删除了我的答案,因为我担心这可能是错的

c++ stl language-lawyer

5
推荐指数
2
解决办法
635
查看次数

正向声明库名称

摘自"Exceptional C++":

"在过去,你可以在这种情况下用"class ostream"替换"#include",因为ostream曾经是一个类而且它不在命名空间std中.唉,不再.写"class ostream; "有两个原因是非法的:

ostream现在位于命名空间std中,并且不允许程序员声明存在于命名空间std中的任何内容.

ostream现在是模板的typedef; 具体来说,它的typedef为basic_ostream.在任何情况下,basic_ostream模板不仅在前向声明时都很麻烦,而且你根本无法可靠地前向声明它,因为允许库实现添加自己的额外模板参数(超出了标准),当然,你的代码不会知道程序员不允许在命名空间std中为事物编写自己的声明的规则的主要原因之一."

我的问题:

我不明白用粗体标出的部分.

谢谢,

c++ stl compilation

0
推荐指数
1
解决办法
524
查看次数