2012-01-23 217 views
2

我要實現模板專業化,在實現專用模板類的構造函數時編譯器會產生一些錯誤。以下是我的代碼:模板專業化實現

#include <iostream> 
using namespace std; 

// class template 

template <typename T> 
class mycontainer 
{ 

T element; 
    public: 
    mycontainer (T arg); 
    T increase() {return ++element;} 
}; 

// class template specialization 
template <> 
class mycontainer <void> { 
    int element; 
    public: 
    mycontainer (int arg); 

    char uppercase() 
    { 
    return element; 
    } 
}; 

template<typename T> mycontainer<T>::mycontainer(T arg){ 
    cout << "hello T" << endl; 
} 

template<typename T> mycontainer<void>::mycontainer(int arg){ 
    cout << "hello Empty" << endl; 
} 

int main() { 
    mycontainer<int> myint (7); 
    mycontainer<void> myvoid (6); 
    cout << myint.increase() << endl; 
    return 0; 
} 

的代碼生成這些錯誤:

test.cpp:31:22: error: prototype for ‘mycontainer<void>::mycontainer(int)’ does not match any in class ‘mycontainer<void>’ 
test.cpp:16:26: error: candidates are: mycontainer<void>::mycontainer(const mycontainer<void>&) 
test.cpp:19:5: error:     mycontainer<void>::mycontainer(int) 

就如何解決這些錯誤的任何線索?

回答

0

你完全專業化的語法是錯誤的,你不應該使用template<typename T> mycontainer<void>或者甚至沒有template<>

爲什麼?請參閱C++模板書的引用:

完整的專業化聲明與這種方式的普通類聲明(它不是模板聲明)完全相同。唯一的區別是語法和事實,即聲明必須匹配先前的模板聲明。 因爲它不是模板聲明,所以可以使用普通的類外成員定義語法(換句話說,不能指定模板<>前綴)來定義完整類模板專業化的成員:

所以可以做

mycontainer<void>::mycontainer(int arg){ 
    cout << "hello Empty" << endl; 
} 

或做:

#include <iostream> 
using namespace std; 

// class template 

template <typename T> 
class mycontainer 
{ 

T element; 
    public: 
    mycontainer<T>::mycontainer(T arg) 
    { 
     cout << "hello T" << endl; 
    } 
    T increase() {return ++element;} 
}; 

// class template specialization 
template <> 
class mycontainer <void> { 
    int element; 
public: 
    mycontainer (int arg) 
    { 
     cout << "hello Empty" << endl; 
    } 

    char uppercase() 
    { 
    return element; 
    } 
}; 


int main() { 
    mycontainer<int> myint (7); 
    mycontainer<void> myvoid (6); 
    cout << myint.increase() << endl; 
    return 0; 
} 
0

原型

template<typename T> mycontainer<void>::mycontainer(int arg){ 
    cout << "hello Empty" << endl; 
} 

不匹配,一個在專業化。保留模板參數爲空。

這就是說:你的C++看起來不像你準備好使用模板。您應該首先獲得基本知識。

1

mycontainer<void>不是一個模板,也不是它的構造,所以構造函數的定義應該僅僅是:

mycontainer<void>::mycontainer(int arg){ 
    cout << "hello Empty" << endl; 
}