2015-04-30 85 views
2

考慮這個代碼。模板類專業化函數調用。 C++

template<class T> 
class A 
{ 
    public: 
     void f(){..} 
     void h(){..} 
}; 


template<> 
class A<int> 
{ 
    public: 
     void f(){// something different..} 
     //void h(){..} 
}; 

int main() 
{ 
    A<int> obj; 
    obj.h(); // I want to call A<T>::h(), but compiler erred that there is no h function in A<int> 
} 

有沒有一種方法來打這個電話?或者一些解決方法?

+3

編譯器是正確的。你可以在別處放置'h'函數,例如一個基類。 – interjay

+0

@Eduard Rostomyan如果它不存在,你打算怎麼稱呼它? –

+0

@VladfromMoscow,我想打電話給A :: h(),我不知道如何,如果我知道我寧願問這個問題。 –

回答

3

A<T>是一個類模板,該類模板基於任何類型名稱T引入了一類A類。 A<int>A<T>的顯式特化 - 它取代了泛型類的定義。這是沒有從寫過不同:

class Aint { 
public: 
    void f(); 
}; 

這種專業化只有一個成員函數 - f。所以,當你嘗試這樣做:

A<int> obj; 
obj.h(); 

這並不編譯,因爲A<int>沒有名爲h的成員函數。儘管兩者都被命名爲A,A<int>A<T>是不相關的 - 一個不是另一個的基類,並且在通用的A<T> - A<int>專有中不存在它們的函數和成員並不重要。

如果h是共同的東西,你可以將其移動到一個基類:

struct ABase { // or alternatively ABase<T> 
    void h(); 
} 

template <typename T> 
class A : ABase { 
    void f(); 
}; 


template <> 
class A<int> : ABase { 
    void f(); 
}; 

這樣,所有的A的實例化將有h()。也就是說,直到有人繼續並補充說:

template <> 
class A<char> // no inheritance 
{ 
    // no h() 
}; 
2

取決於你有多少東西在你的專業化改變,你可能會更好只是專業fA<int>,而不是專門整個類:

template<class T> 
class A 
{ 
    public: 
     void f(){cout << "standard";} 
     void h(){cout << "standard";} 
}; 

template<> 
void A<int>::f() {cout << "specialized";} 

int main() 
{ 
    A<bool>{}.f(); //outputs standard 
    A<int> obj; 
    obj.f();  //outputs specialized 
    obj.h();  //outputs standard 
} 

如果您的專業是比這更復雜,你可以將常見行爲列入基類並從中派生出A

2

此代碼的工作對我來說:

template<class T> 
class BaseA { 
public: 
    void f(){...} 
    void h(){...} 
}; 

template<class T> 
class A : public BaseA<T> 
{ 
}; 


template<> 
class A<int> : public BaseA<int> 
{ 
    public: 
     void f(){...} 
     //void h(){..} 
}; 

int main() 
{ 
    A<int> obj; 
    obj.h(); // I want to call A<T>::h(), but compiler erred that there is no h function in A<int> 
} 

它聲明這是雙方繼承的基類。