我有一个模板struct tree_parse_info声明如下:
template <
typename IteratorT,
typename NodeFactoryT,
typename T
>
struct tree_parse_info
{
// ...
};
编译器允许以下代码:
tree_parse_info<> m_info;
为什么这个代码编译即使我们没有模板struct tree_parse_info的默认模板参数?
答案 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)
因此,您必须编译除了向我们展示的代码之外的其他内容。