模板默认参数

如果我被允许做以下事情:

template <typename T = int>
class Foo{
};

为什么不允许我做以下主要?

Foo me;

但我必须说明以下几点:

Foo<int> me;

c++ 11引入了默认模板参数,现在我完全理解不了它们。

113365 次浏览

<强>注意:< / >强

从c++ 17开始,没有模板参数的Foo me;是合法的。请看这个答案:https://stackoverflow.com/a/50970942/539997

原答案适用于c++ 17之前:

你必须做到:

Foo<> me;

模板参数必须存在,但可以将其保留为空。

可以把它想象成一个函数foo,它只有一个默认参数。表达式foo不会调用它,但foo()会。参数语法必须仍然存在。这是一致的。

你可以使用以下方法:

Foo<> me;

并将int作为模板参数。尖括号是必要的,不能省略。

你不允许那样做,但你可以这样做

typedef Foo<> Fooo;

然后做

Fooo me;

在c++ 17中,你确实可以做到。

这个特性被称为类模板参数推导,它为你声明模板化类型变量的方式增加了更多的灵活性。

所以,

template <typename T = int>
class Foo{};


int main() {
Foo f;
}

现在是合法的c++代码

根据C++17标准,必须传递模板参数。

但如果你仍然想要解决这个问题,你可以像这样使用using关键字

template <typename T>
class Foo{
};
using IFoo=Foo<int>

或者,你也可以像这样使用preprocessor

template <typename T>
class Foo{
};


#define IFoo Foo<int>

< >强劲快速提醒< / >强

预处理器不利于调试。

有些不同的情况,但稍后,但涉及模板函数GCC 11.2似乎不能编译:

template <typename T = int>
struct Test {};
template<typename T> void foo(T& bar) {}
int main()
{
Test t;
foo<Test>(t);
}

没有问题

template <typename T = int>
struct Test {};
template<typename T> void foo(T& bar) {}
int main()
{
Test t;
foo<Test<>>(t);
}

当然

template <typename T = int>
struct Test {};
template<typename T> void foo(T& bar) {}
int main()
{
Test t;
foo(t);
}

作品 -但有时需要显式强制该类型。这是编译器错误吗?