簡體   English   中英

結構模板的默認參數

[英]Default parameters of struct templates

我有一個模板struct tree_parse_info聲明如下:

template <
    typename IteratorT,
    typename NodeFactoryT,
    typename T
>
struct tree_parse_info 
{
  // ...
};

編譯器允許以下代碼:

tree_parse_info<> m_info;

即使我們沒有模板結構tree_parse_info的默認模板參數,為什么也要編譯此代碼?

如果該類先前已被向前聲明,則無需重新聲明默認參數。 例如:

// forward declare only
template <typename T = int, size_t N = 10>
struct array;

// actual definition
template <typename T , size_t N>
struct array
{};

int main(void)
{
    array<> a; // uses the defaults it saw in the forward-declaration
}

查看您的實際定義上方,看看是否轉發聲明了它。

順便說一句,如果在一個地方提供默認設置,而在另一個地方提供不同的默認設置,則會出現編譯錯誤:

template <typename T = int, size_t N = 10>
struct array;

// error: redefinition of default parameter
template <typename T = double , size_t N = 2>
struct array
{};

嘗試提供您顯示給我們的代碼,這些代碼可能不會偶然匹配,例如:

struct stupid_special_tag_type_lolroflwat {};

template <
    typename IteratorT = stupid_special_tag_type_lolroflwat,
    typename NodeFactoryT = stupid_special_tag_type_lolroflwat,
    typename T = stupid_special_tag_type_lolroflwat
>
struct tree_parse_info 
{
  // ...
};

如果出現重定義錯誤,則說明您已在其他位置為它指定了默認值。

當我使用g ++編譯您的代碼時,出現以下錯誤:

tp.cpp:10:錯誤:模板參數數量錯誤(0,應為3)

因此,您必須編譯除顯示給我們的代碼以外的其他內容。

暫無
暫無

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

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