我在名为'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)
我该如何调用此功能?
背景:
我试图回答这个问题为什么我的重载<运算符不能用于STL排序.我的一个建议(除了使用谓词)是在命名空间std中移动自定义operator <,std::string以便编译器可以优先于模板化版本.
以惊人的速度回答了一个高度知名的用户的评论:
这是未定义的行为,不允许向namespace std添加声明,因为它可以更改标准库componens的行为
我的问题:
是否可以为stl类型添加模板特化,即使此特化的声明不包含用户定义的数据类型?
ps我删除了我的答案,因为我担心这可能是错的
摘自"Exceptional C++":
"在过去,你可以在这种情况下用"class ostream"替换"#include",因为ostream曾经是一个类而且它不在命名空间std中.唉,不再.写"class ostream; "有两个原因是非法的:
ostream现在位于命名空间std中,并且不允许程序员声明存在于命名空间std中的任何内容.
ostream现在是模板的typedef; 具体来说,它的typedef为basic_ostream.在任何情况下,basic_ostream模板不仅在前向声明时都很麻烦,而且你根本无法可靠地前向声明它,因为允许库实现添加自己的额外模板参数(超出了标准),当然,你的代码不会知道程序员不允许在命名空间std中为事物编写自己的声明的规则的主要原因之一."
我的问题:
我不明白用粗体标出的部分.
谢谢,
c++ ×3
stl ×2
c ×1
c++-faq ×1
compilation ×1
declaration ×1
definition ×1
methods ×1
templates ×1
terminology ×1