2011-12-29 92 views
5

我試圖做專業化運營模板,模板看起來是這樣的:運營商()模板特

template <typename Iterator1, typename Iterator2> 
ResultType operator()(Iterator1 a, Iterator2 b, size_t size, ResultType worst_dist = -1) const 

後,我做了,看起來像這樣的專業化:

template <> 
float operator()<float*,float*>(float* a, float const* b, unsigned long size, float worst_dist = -1) const 

我在編譯過程中出現錯誤:

無法在類範圍內專用函數'operator()'

所有這些功能都在結構模板

我會很高興得到一些幫助。 謝謝。

+0

當你說「規範」時,你的意思是「專業化」嗎? – 2011-12-29 14:47:22

+0

我認爲[這個問題/答案] [1]可能會回答你正在嘗試做的事情。 [1]:http://stackoverflow.com/questions/4920068/partially-specializing-member-function-implementations – wilx 2011-12-29 14:52:01

+0

什麼是'ResultType'?它應該是你的模板參數之一嗎? – 2011-12-29 15:00:23

回答

7

爲什麼你想專門操作這個操作符呢?無論如何,您將無法使用依賴於特殊化的語法(即明確提供[某些]模板參數)來調用它!只要使用重載,你應該沒問題。儘管在顯式指定模板參數的地方使用表示法有時甚至是需要的,甚至是必要的,但對於通常使用特化而不是重載的函數而言,它往往並不重要。

我只是讀了標準中的東西,實際上可以提供明確的專業化,但它必須在類定義之外。例如:

#include <iostream> 

struct foo 
{ 
    template <typename T> void operator()(T const&) { 
     std::cout << "general\n"; 
    } 
}; 

template <> 
void foo::operator()<int>(int const&) { 
    std::cout << "int spec\n"; 
} 

int main() 
{ 
    foo f; 
    f(1.2); 
    f(1); 
    f<double>(1); // <-- ERROR: doesn't work! 
} 

這將使用重載工作。不過,使用顯式指定的模板參數仍然不起作用。

+1

+1用於功能重載專精。 – AJG85 2011-12-29 15:22:28

+0

我明白了,謝謝你的回答 – 2011-12-29 15:53:49