簡體   English   中英

使用 char * 作為模板參數編譯錯誤

[英]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;

Tchar * ,則 function 類型不是const char * const適用於T ,所以你真正擁有的是char * const 這意味着您需要覆蓋的 function

void foo(char* const& t) override {};

West const 最差 const 東 const 最佳 const

const 適用於其左側的類型部分。 當且僅當其左側沒有任何東西(或支架或其他 scope 限制器)時,它才適用於其右側的東西。

East const 是指習慣性地將 const 放在您想要 const 的東西的右側(東)。

West const 是把 const 放在左邊的習慣。

west const 的問題在於

const char*

實際上是

char const*

不是

char* const

這是你的錯誤的來源。

在 west const 樣式中,當Tchar*時, const Tchar*const 奇怪。

在東部 const 樣式中, Tchar*時的 T T constchar*const 一點也不奇怪。

所以當Tchar*時 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM