我有一個模板類,它的形式大致如下:
。template <int index = 0>
struct Thing {
void Hello();
void Greet(const char *name)。
};
這對它的目的來說是很好的,直到人們決定嘗試對自己呼叫方法。假設你定義了如下所示的方法。
template<>
void Thing<>::Greet(const char *name) {
Hello()。
printf(", %s!
", name)。)
}
template <>
void Thing<>::Hello( ) {
printf("Hello"/span>)。
}
然后呼叫Greet()會產生一個明確的特殊化錯誤,我覺得這很奇怪。編譯器應該通過其介面宣告知道this的所有方法,但是由于某些原因,在這種情況下它不能解決這個問題。這可以通過兩種方式之一來解決;要么你必須轉發宣告你自己所呼叫的任何方法,要么確保方法的定義順序能夠確保你所呼叫的方法被事先定義。
這個問題真的很煩人,因為我已經提供了一個介面宣告,而模板的任何特殊化都應該符合相同的介面,所以我真的不明白為什么編譯器會抱怨這個問題--有什么方法可以解決這個問題,而不需要用每個方法的正向宣告來污染代碼,或者必須以特定的方式排列方法?
我希望你有一些很好的想法來以更好的方式解決這個問題。預先感謝您!
為了便于重現,您可以在這里找到一些方法。
為了便于再現該問題,這里有一個將呼叫違規方法的代碼段。
int main(int argc, const char *argv[]) {
Thing<0> thing_with_zero;
thing_with_zero.Greet("World")。
return 0;
uj5u.com熱心網友回復:
你可能會對整個類進行特殊化,以確保特殊化被看到:
//初級模板
// generic one
template <int index = 0>
struct Thing {
void Hello() {/*...*/}
void Greet(const char *name) {/*.}.
};
///index == 0的特殊化。
template <>
struct Thing<0> {
void Greet(const char *name) {
Hello()。
printf(", %s!
", name)。)
}
void Hello() {
printf("Hello") 。
}
};
另外,你可以在if constexpr(C 17)的幫助下放棄特殊化:
template <int index = 0>
struct Thing
{
void Greet(const char *name) {
if constexpr (index == 0) {
Hello()。
printf(", %s!
", name)。)
} else {
/ /span> ...
}
}
void Hello( ) {
if constexpr (index == 0) {
printf("Hello"/span>)。
} else {
// .../span>
}
}
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/316143.html
標籤:
上一篇:使用pythonregex通過星號搜索/替換自定義標簽之間的單詞
下一篇:正則運算式使逗號分隔的數字無效
