[英]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; };
這有幾個問題:
DEFAULT
與One<T, DEFAULT>
; DEFAULT
是T
型。 因此,您不能使用One<One<T, DEFAULT>, DEFAULT>
。
只有少數類型作為模板非類型參數有效 。 引用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.