2015-06-27 8 views
0

我已經工作了一組代表幾何形狀的各種比特模板類的,我意識到,我希望能夠專注不同的類來處理引用和指針例如方法未定義的引用部分專業類

template<typename T> 
class rect{ // as in rectangle 
public: 
    point<T> point1, point2; // Point simply contains two instances of type T 
    ... // Twenty functions or so follow 
}; 

template<typename T> 
class rect<point<T>>{ // trying to put a point in a point makes no sense anyway 
public:    // so I see this technique as valid 
    point<T>& point1,& point2; 
    ... // I really don't want to redefine them if I don't have to 
}; 

的問題,我的測試程序啓動

#include <iostream> 
#include <TGeometry.hpp> 

template<typename T> 
class test{ 
public: 
    T A; 

    void myfunc(){std::cout << "from base\n";} 
    void otherfunc(T O); 
    test(const T nA) : A(nA) {} 
    test(){} 
}; 

template<typename T> 
void test<T>::otherfunc(T O){A += O;} 

template<typename T> 
class test<T&>{ 
public: 
    T& A; 

    void myfunc(){std::cout << "from refr\n";} 
    void otherfunc(T O); // Shouldn't this default to using test<T>::otherfunc? 
    test(T& nA) : A(nA) {} 
}; 


int main(){ using std::cout; 
    using namespace d2; 

    test<int> Atest(5); 
    test<int&> Btest(Atest.A); 

    Atest.myfunc(), Btest.myfunc(); 
    Btest.otherfunc(Atest.A); // test<T&>::otherfunc undefined? 
    Atest.otherfunc(10); 

    std::cin.ignore(); 
    return 0; 
} 

這個程序在Mingw_w64編譯,與

C:\Users\*>g++ -o test.exe quicktest.cpp -I .\Libraries 
C:\Users\THEMAG~1\AppData\Local\Temp\ccszH6xM.o:quicktest.cpp:(.text+0x42):undefined reference to `A<char, 2>::f()' 
collect2.exe: error: ld returned 1 exit status 

這將退出可能只是缺乏對我的部分知識,但this網站(底部,在部分專業化成員下的第一個例子)意味着你可以排除部分專業化的功能定義,只要喲你已經聲明瞭它,它將默認使用主模板的定義。

如果能夠做到這一點會救我的工作日內,我就不必重新定義我的所有類的功能。所以我的問題是,什麼是保持我的代碼編譯,並且可以/如何專門化我的類的引用(我仍然需要做指針)而不必重新定義它們的函數?這只是一個參考問題,它會改變代碼的工作方式,例如如果使用函數,主要專業化的功能只會改變參考。

+0

錯誤消息不能與您顯示的代碼相關。代碼沒有提到名爲'A'的模板,也沒有提到名爲'f'的成員函數。 –

+0

如果您發佈代碼生成的鏈接器錯誤可能會有幫助,因爲您發佈的代碼示例中沒有對f()的引用。 – kfsone

+0

根據ideone(http://ideone.com/JZemgY)在MVCE錯誤是'未定義參考 '測試 :: otherfunc(INT)''? – kfsone

回答

0

我不認爲這個概念在專業類模板繼承方法的實現從非專業化的類模板是正確的。考慮例如std :: enable_if。該類的全部要點是通過引用模板的專用版本中不存在的類型來觸發置換失敗。如果你描述的行爲是正確的,那麼這是行不通的。或者至少,你需要使用兩個專業化來定義enable_if,而不是通用和專業化(事實並非如此)。

我認爲這是一個「XY」的情況:你希望能夠做一些事情,但我認爲更可能是你應該修改你的設計,這樣你就不需要做那件事。我可以想象得到通用模板成員函數的情況是有用的,但它應該比較少見,這並不意味着我是其中一種情況。

更有可能的是,如果你的模板的整個點是把類型T放在一個點上,並且把一個點放在一個點上是沒有意義的,你應該靜態聲明T本身不是某種Point模板類。專業化給你什麼額外的功能?你爲什麼需要參考/指針專業化?

+0

事實證明,我對網站的解釋是缺乏的。它在評論他們的代碼時特別說明了函數必須被定義,但我想我太急於完成這一切。 具有矩形>或三角形背後的想法>創建引用類以指向是所以我可以有對象,如三角形連接以形成網狀,並使用單個點來代表每個頂點 – user4578093

+0

這不是一般的好想法將對外部實體的引用存儲在一個對象中,您可以非常輕鬆地獲得懸掛引用。老實說,我可能完全放棄模板,只是使用存儲點的矩形,除非您真的預期使用除雙打以外的東西。不要爲你不需要的複雜性付費。 –