2013-03-18 105 views
5

内我有一个叫头文件中的下列方法“filter.h”:我注意到C++不能调用方法(使用模板)从模板方法

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<T>内的方法convolve的定义:

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

如何我一定要调用这个函数?

+0

'in'是'const'参数,所以非''constst'成员函数不能被调用。 – hmjd 2013-03-18 21:07:41

+0

'binomial'似乎认为'convolve'是一个函数模板,但'convolve'看起来不像函数模板(只是模板类的成员函数)。 – aschepler 2013-03-18 21:08:21

+0

为什么你的代码在'namespace std'中?添加到'std'名称空间(非专业化)是非法的。 – Praetorian 2013-03-18 21:17:37

回答

6

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

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

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

convolve()是非const成员函数,而你试图通过一个参考来调用它const。这是非法的,编译器告诉你。


此外,作为正确他的回答中指出JBentley,你不能添加新的声明或定义为std命名空间。每一段中的C++ 11标准的17.6.4.2.1/1:

一个C如果它增加了空间std除非另有内声明或定义到空间std或一个 命名空间++程序是未定义的行为指定。 [...]

+0

谢谢!我称这个命名空间为'std',因为缺少这个具体问题的另一个名字......但是,我还没有意识到这个事实,我无法命名自己的命名空间'std',所以非常感谢。 – kaufmanu 2013-03-18 22:18:21

2

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

请参阅this questionthis one

+0

+1,我没有注意到。在我的回答中也会提到它 – 2013-03-18 21:16:28