2013-05-10 75 views
1

專業一個基類的成員函數有一個看看這個代碼:在派生類模板

struct foo { 
    virtual int bleh() { 
     return 42; 
    } 
}; 


template<typename T> 
struct bar : public foo { 

}; 

// ERROR 
template<> 
int bar<char>::bleh() { 
    return 12; 
} 

我想只爲bar<char>提供base::bleh的定義,但是編譯器(GCC 4.7。 2)rejects我的代碼如下診斷:

template-id ‘bleh<>’ for ‘int bar<char>::bleh()’ does not match any template declaration 

好像base::bleh以某種方式隱藏在bar。使用下面的定義bar我已經解決了這個問題:

template<typename T> 
struct bar : public foo { 
    // doesn't work 
    //using foo::bleh; 

    // this works 
    int bleh() { 
     return foo::bleh(); 
    } 
}; 

不過我很好奇,爲什麼這個不能編譯。爲什麼編譯器會拒絕我的代碼?

回答

3

在您的非編譯示例中,您試圖專門化並定義一個函數,該函數尚未在bar的模板定義中聲明...在後面的示例中,您實際已聲明以及定義了非-的模板定義中的函數的特定版本,這是編譯的原因。從我所知道的,這裏是標準中關於爲什麼第一個版本不能編譯的相關語言(14.7.3/4):

成員函數,成員函數模板,成員類,類模板的成員枚舉,成員類模板或靜態數據成員 可以明確專用於隱含實例化的類 專業化;在這種情況下,類模板的 定義應該在類模板的成員的顯式 專業化之前