c++ - 结构模板的默认参数

标签 c++ templates struct default parameters

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

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

编译器允许以下代码:

tree_parse_info<> m_info;

为什么即使我们没有模板 struct 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 
{
  // ...
};

如果您遇到重定义错误,则表明您已经在其他位置为其提供了默认值。

关于c++ - 结构模板的默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2107934/

相关文章:

C++ 11在缺少时提供空的非成员函数

C++ - 这个单独的编译代码有什么问题?

c - 抽象结构体数组

c++ - 初始化列表的分配

c++ - 为什么析构函数只被调用一次?

c# - 在C#中解密Crypto++ RSA密文导致异常

c++ - 在存在不可预测的类型别名的情况下如何处理显式模板实例化?

c++ - CMake 使库需要 cxx 标准

c++ - 我如何使用 GNU C++ 引用继承类的字段?

c++ - 使用 constexpr 构造函数前向声明结构