[英]compile error with char * as template parameter
有人能告訴我這段代碼有什么問題嗎?
template <typename T>
class Base
{
public:
virtual void foo(const T & t) = 0;
virtual ~Base() {}
};
struct Derived : Base<char *> {
void foo(const char * & t) override {};
};
我得到編譯錯誤
void Derived::foo(const char*&)' 標記為“覆蓋”,但不覆蓋。
為什么char *
不是一個有效的模板參數?
當你有
virtual void foo(const T & t) = 0;
而T
是char *
,則 function 類型不是const char *
。 const
適用於T
,所以你真正擁有的是char * const
。 這意味着您需要覆蓋的 function
void foo(char* const& t) override {};
const 適用於其左側的類型部分。 當且僅當其左側沒有任何東西(或支架或其他 scope 限制器)時,它才適用於其右側的東西。
East const 是指習慣性地將 const 放在您想要 const 的東西的右側(東)。
West const 是把 const 放在左邊的習慣。
west const 的問題在於
const char*
實際上是
char const*
不是
char* const
這是你的錯誤的來源。
在 west const 樣式中,當T
為char*
時, const T
為char*const
。 奇怪。
在東部 const 樣式中, T
為char*
時的 T T const
為char*const
。 一點也不奇怪。
所以當T
是char*
時 T T const&
是char*const&
,而不是你寫的const char*&
(又名char const*&
)。
立即解決編譯錯誤:
struct Derived : Base<char *> {
void foo(char* const& t) override {};
};
const char*
表示指向常量字符的指針,但您需要引用常量字符指針。 這與前者不同,並且需要const
-qualifier 的不同位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.