如果我有一个默认的模板类型的模板类,我写的模板尖括号。 是它在某种程度上能够避免这种情况?
例:
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;
问题是,如果我想使用的类与其他类型的我走了过来命名空间detail_。 有另一种解决方案 ,我没有看到呢。
......如果我想使用的类...
这是混乱的公共源极。 类模板不是类,而是从其中产生的类的模板。 尖括号就是告诉你要产生一类出给定模板参数的类模板的编译器,没有尖括号你有什么是一个模板 。
template <typename T = int>
struct TemplateClass {...};
template <template class T<typename> >
void f() {
T<int> t; ...
}
template <typename T>
void g() {
T t; ...
}
f<TemplateClass>(); // Accepts a template with a single type argument
g<TemplateClass<> >(); // Accepts a type, that can be generated out of the template
语言不允许模板,并在同一个命名空间中的同名类型的共存,所以答案是,它无法做到的。 您可以创建一个类型别名,但你必须给它一个不同的名称。
由于因为C ++ 17, 类模板参数推导 ,事情发生了变化 。
tt
和tt<>
是不一样的事情:类型和类模板是不同的,并继续区别对待。
反正在简单的场景就像一个在你的例子,C ++ 17假定你的意思和<>
不再需要的。
更多详情:
- 模板默认参数 (具体https://stackoverflow.com/a/50970942/3235496 );
- 为什么<>指定其具有用于其所有的模板参数默认模板类时,需要?