簡體   English   中英

無法使用模板參數編譯類

[英]Unable to compile class with a template parameter

我有一些非常簡單的代碼,看起來像這樣:

template <typename T, const T DEFAULT>
class One
{
    T *p;
};

template <typename T, const T DEFAULT>
class Two
{
    One<One<T, DEFAULT>, DEFAULT> *p;
};

當我嘗試編譯它時,我收到一條錯誤消息:

錯誤:'class One'不是模板非類型參數的有效類型

但是,當我將const T DEFAULT更改為typename T2並將DEFAULT更改為T2 ,它將開始工作:

template <typename T, typename T2>
class One
{
    T *p;
};

template <typename T, typename T2>
class Two
{
    One<One<T, T2>, T2> *p;
};

但是,這不是我想要的。 我需要我的第一個代碼工作變體,但我不知道這有什么問題,我該如何解決它。

 template <typename T, const T DEFAULT> class One { T *p; }; template <typename T, const T DEFAULT> class Two { One<One<T, DEFAULT>, DEFAULT> *p; }; 

這有幾個問題:

  1. DEFAULTOne<T, DEFAULT> ; DEFAULTT型。 因此,您不能使用One<One<T, DEFAULT>, DEFAULT>

  2. 只有少數類型作為模板非類型參數有效 引用cppreference:

    • std :: nullptr_t(自C ++ 11起);
    • 積分型;
    • 左值引用類型(對象或函數);
    • 指針類型(對象或函數);
    • 指向成員類型的指針(到成員對象或成員函數);
    • 枚舉類型。

One<T, DEFAULT>不是上述之一,因此它不能用作模板非類型參數

 template <typename T, const T DEFAULT> class One 

第二個T指的是第一個,它是名為DEFAULT的非類型模板參數的類型。

例如,您可以像這樣實例化One模板:

One<int, 12345> // T is int, DEFAULT is 123456

或者像這樣:

One<char, 100> // T is char, DEFAULT is 100

或者像這樣:

One<int*, nullptr> // T is int*, DEFAULT is nullptr

這些示例的共同點是T必須是有效的非類型模板參數。 例如,您不能使用類型模板參數:

One<std::string, 123> // fails, because `std::string` cannot be used as `DEFAULT`

現在,如果你看看你的第二堂課......

 template <typename T, const T DEFAULT> class Two { One<One<T, DEFAULT>, DEFAULT> *p; }; 

One外部實例化嘗試中, T將是One<T, DEFAULT> 這與上面的std::string示例完全相同; One<T, DEFAULT>不是非類型模板參數。

對此沒有“修復”,因為你的Two類的概念從根本上被打破了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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