2012-01-23 117 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; 
}