2017-02-08 117 views
0

我有一個從另一個模板繼承的模板,本身作爲第二個模板的模板參數。繼承的模板定義了一個靜態函數:具有靜態功能模板的模板專業化

template<class T> class A 
{ 

public: 

    static void foo(); 
}; 

template<class T> class B : public A<B> 
{ 

}; 

現在我要實現對A類專門爲B靜態函數,但爲B不專業。但我無法弄清楚如何聲明模板。我甚至不確定這是否可能。我的第一個嘗試是:

template<class T> void A<B<T>>::foo() 
{ 

} 

但這給出了錯誤:

"Nested name specifier 'A<B<T>>::" for declaration does not refer into a class, class template or class template partial specialization" 

我試着像前面添加「模板<>」,但沒有工作的那些不同的東西。我能夠編譯此:

template<> void A<B<int>>::foo() 
{ 

} 

除了這一點:

template<class T> void A<T>::foo() 
{ 

} 

這是在部分專業化的嘗試?我的第一印象是沒有(有沒有模板與多個參數,我想專門化其中之一)。相反,我想用另一個不專門的模板專門化模板。這是可能的,如果是這樣,什麼是正確的語法?

+0

謝謝,我剛剛糾正。我想實現A與B的專業化的靜態功能,但沒有專門化B. – sweatervest

回答

0

這確實是部分專業化。你不能部分專精一種方法,你必須部分專門化整個班級。見this answer。您可以嘗試在單獨的幫助程序結構中實現foo,並部分專門化該結構。

這是一個使用helper結構的例子。

#include <iostream> 

template<class T> struct t_helper 
{ 
    static void foo() 
    { 
     std::cout << "Not B<T>\n"; 
    } 
}; 

template<class T> class A 
{ 

public: 
    static void foo() { 
     t_helper<T>::foo(); 
    } 
}; 

template<class T> class B {}; 

// Specialize the behavior of A<T>::foo() for all B types 
template<class T> 
struct t_helper<B<T>> 
{ 
    static void foo() 
    { 
     std::cout << "Is B<T>\n"; 
    } 
}; 

int main() 
{ 
    A<int>::foo(); // Prints "Not B<T>\n" 
    A<B<int>>::foo(); // Prints "Is B<T>\n" 
    return 0; 
} 
+0

謝謝!我最終只是部分專業化整個班級。 – sweatervest