2012-01-22 91 views
3

我不想問這樣一個普遍的問題,但下面的代碼是顯式模板專業化的練習。我不斷收到錯誤:明確的模板專業化

c:\users\***\documents\visual studio 2010\projects\template array\template array\array.h(49): error C2910: 'Array::{ctor}' : cannot be explicitly specialized

#ifndef ARRAY_H 
#define ARRAY_H 

template <typename t>` 
class Array 
{ 
public: 
Array(int); 

int getSize() 
{ 
    return size; 
} 
void setSize(int s) 
{ 
    size = s; 
} 
void setArray(int place, t value) 
{ 
    myArray[place] = value; 
} 
t getArray(int place) 
{ 
    return myArray[place]; 
} 
private: 
    int size; 
    t *myArray; 
}; 

template<typename t> 
Array<t>::Array(int s=10) 
{ 
    setSize(s); 
    myArray = new t[getSize()]; 
} 

template<> 
class Array<float> 
{ 
public: 
    Array(); 
}; 

template<> 
Array<float>::Array() 
{ 
    cout<<"Error"; 
} 

#endif 

感謝

回答

5

專業化的構造函數的實現不是一個模板!也就是說,你只想寫:

Array<float>::Array() 
{ 
    std::cout << "Error"; 
} 

事實上,它似乎要限制使用您的「陣」類模板的不與「浮動」在這種情況下,您可能希望只使用聲明但不定義您專業化打開運行時錯誤成編譯時錯誤:

template <> class Array<float>; 

當然,也有很多變化,你如何防止類實例化。但是,創建運行時錯誤似乎是最糟糕的選擇。

+0

我仍然有問題...整個代碼應該是什麼樣子? – David

+0

刪除'Array :: Array()'前的'template <>'。我得到的其他錯誤與此特定問題無關:我需要添加'#include '和'using namespace std;',我需要從模板化的'Array'構造函數的_definition_中刪除默認參數(您需要默認參數_declaration_)。有了這些改變,我使用g ++,clang和EDG的前端編譯。 –

+0

感謝您的幫助! – David