2013-03-18 106 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