struct模板的默认参数

时间:2010-01-21 08:55:54

标签: c++ templates struct default parameters

我有一个模板struct tree_parse_info声明如下:

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

编译器允许以下代码:

tree_parse_info<> m_info;

为什么这个代码编译即使我们没有模板struct tree_parse_info的默认模板参数?

2 个答案:

答案 0 :(得分:5)

如果先前已经向前声明了类,则无需重新声明默认参数。例如:

// 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 
{
  // ...
};

如果您收到重新定义错误,则表示您已在其他位置给出了默认值。

答案 1 :(得分:3)

当我使用g ++编译代码时,出现以下错误:

  

tp.cpp:10:错误:错误的数量   模板参数(0,应为3)

因此,您必须编译除了向我们展示的代码之外的其他内容。