如果我的模板类具有默认模板类型,则必须编写模板尖括号。 是否可以避免这种情况?

例子:

template <typename T=int>
class tt {
public:
  T get() { return 5; }
};

...

tt<> t;  // how to avoid <>
std::cout << t.get() << std::endl;

到目前为止,我已经通过一个单独的命名空间并重新声明了该类来做到这一点:
namespace detail_ {
template <typename T=int>
class tt {
public:
  T get() { return 5; }
};
}

class tt : public detail_::tt {}

...

tt t;
std::cout << t.get() << std::endl;

问题是,如果要与其他类型一起使用该类,则必须遍历 namespace detail_。 还有另一种解决方案,我还没有看到。

最佳答案

从C++ 17开始,由于class template argument deduction,事情变成have changed
tttt<>不是同一件事:类型和类模板是不同的,并且继续被区别对待。

无论如何,在简单的场景中(例如您的示例中的场景),C++ 17都会假设您的意思,并且不再需要<>了。

更多详细信息:

  • Template default arguments(特别是https://stackoverflow.com/a/50970942/3235496);
  • Why is <> required when specifying a template class which has defaults for all its template parameters?
  • 09-10 04:42
    查看更多