2012-02-28 100 views
2

我已經成功地我的困惑凝結下面的代碼:通過模板標籤困惑

template<typename T> 
class BTI { 
public: 
    char func(char); 
}; 

template<int i> 
class Tag {}; 

template<int i> unsigned char 
BTI<Tag<i> >::func(char c) { 
    return c; 
} 

這是爲了:

  1. 聲明模板類BTI
  2. 一個聲明模板化標籤類Tag
  3. 提供func的模板專用實現,當時BTI的模板參數是Tag<i>

當我運行此通過g++ -fsyntax-only(使用G ++ 4.1.2),我得到:

test.cc:11: error: invalid use of undefined type ‘class BTI<Tag<i> >’ 
test.cc:2: error: declaration of ‘class BTI<Tag<i> >’ 
test.cc:11: error: template definition of non-template ‘unsigned char BTI<Tag<i> >::func(char)’ 

我甚至不知道該怎麼在這一點嘗試。有任何想法嗎?

+0

但BTI在沒有模板化的情況下,也就是說它從不使用T.也是特殊化返回一個無符號字符,而不是char? – vulkanino 2012-02-28 16:50:33

+0

func不是模板函數,所以你不能專門化它。我認爲你可能需要專門研究整個班級,或者讓func成爲一個獨立的助手(模板)功能。我會玩... – BoBTFish 2012-02-28 16:53:31

+0

添加到@BoBTFish所說的,即使'func'是一個函數模板,你可以*不專門化它,因爲你嘗試一個*部分*專業化,C++只支持完整的專業化功能模板(如同模板一樣)。 – 2012-02-28 17:14:07

回答

3

如果你正在嘗試我認爲你試圖嘗試的事情,那麼你需要完全專注於BTI,而不僅僅是一個功能;像這樣:

template<typename T> 
class BTI { 
public: 
    unsigned char func(char); 
}; 

template<int i> 
class Tag {}; 

template<int i> 
class BTI<Tag<i> > { 
public: 
    unsigned char func(char); 
}; 

template<typename T> unsigned char 
BTI<T>::func(char c) { 
    return 'X'; 
} 

template<int i> unsigned char 
BTI<Tag<i> >::func(char c) { 
    return c; 
} 

int main() { 
    BTI<int> x; 
    BTI<Tag<0> > y; 
    std::cout << x.func('a') << std::endl; 
    std::cout << y.func('a') << std::endl; 
} 

這將首先打印'X'(一般情況下),然後'a'(專業情況)。

+0

是的。這一點以及BoBTFish和Konrad Rudolph的上述評論都非常出色。謝謝! – fiddlemath 2012-02-28 19:13:21

+0

特別是,如果'func'是完全專用的,你的版本將*不*'*沒有定義類BTI '',但* * *將工作,而沒有定義類BTI 。 (如下所示: 'template <> unsigned char BTI > :: func(char c){return c;}' ) 正如@Konrad的評論所預測的那樣。 :) – fiddlemath 2012-02-28 19:19:22