2012-10-12 85 views
0
  1. 如何確保(類)模板的專業化實現所有 函數? (現在只有當我使用mul時,是否會收到錯誤消息。)
  2. traits1/traits2的特化到int的區別是什麼?我認爲他們都是模板專業化,但traits2不接受static,並提供鏈接器錯誤,而不是編譯器錯誤。

模板專業化中缺少方法

#include <iostream> 

template<typename T> 
struct traits1{ 
    static T add(T a, T b) { return a+b; } /* default */ 
    static T mul(T a, T b);    /* no default */ 
}; 

template<> 
struct traits1<int> { 
    static int add(int a, int b) { return a*b; } 
    /* static int mul(int a, int b) missing, please warn */ 
}; 

template<typename T> 
struct traits2{ 
    static T add(T a, T b); 
    static T mul(T a, T b); 
}; 

template<> 
int traits2<int>::add(int a, int b) { return a*b; } 

/* traits2<int>::mul(int a, int b) missing, please warn */ 

int main() 
{ 
    std::cout << traits1<int>::add(40, 2) << "\n"; 
    // error: mul is not a member of traits1<int> 
    //std::cout << traits1<int>::mul(40, 2) << "\n"; 

    std::cout << traits2<int>::add(40, 2) << "\n"; 
    // error: undefined reference to traits2<int>::mul(int, int) 
    //std::cout << traits2<int>::mul(40, 2) << "\n"; 
    return 0; 
} 

回答

2

1)如果你想要的只是一個特定函數的不同行爲,那麼不要專門化整個類。只專注於這個功能:

template<> 
int traits1<int>::add(int a, int b) { return a*b; } 

你不能確定專業化實現所有模板方法,因爲它們是不相關的。

2)您沒有提供traits2::mul的定義,所以當然你會得到鏈接器錯誤 - 聲明就在那裏。

+0

1)我想專門化所有功能,這只是測試當一個功能丟失時會發生什麼。 2)但爲什麼traits1和traits2的錯誤信息不同?我希望雙方都抱怨mul缺少(以同樣的方式) –

+0

@MichaWiedenmann如果你專門做了所有的功能,你不會得到錯誤,所以你的問題沒有意義。 –

+0

@MichaWiedenmann 2)這是相同的錯誤 - 「prog.cpp :(。文本+ 0x8a):未定義的引用'traits1 :: mul(int,int)' prog.cpp :(。text + 0xf2):undefined引用'traits2 :: mul(int,int)'「請參閱http://ideone.com/uCeJz –