如果我有一个默认模板类型的模板类,我必须编写模板尖括号。 以某种方式可以避免这种情况吗?
实施例:
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_。 还有其他解决方案,我还没有看到。
答案 0 :(得分:8)
...如果我想使用该课程......
这是混淆的常见原因。类模板不是类,而是生成类的模板。尖括号告诉编译器你想用给定的模板参数从类模板中生成一个类,而没有尖括号你有的是模板。
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
该语言不允许模板与同一名称空间中具有相同名称的类型共存,因此答案是无法完成。您可以创建类型别名,但必须为其指定不同的名称。
答案 1 :(得分:5)
您可以使用typedef ...
typedef tt<> tt_;
然后只需使用tt_
。
答案 2 :(得分:2)
从C ++ 17开始,由于class template argument deduction,事情have changed。
tt
和tt<>
不是同一件事:类型和类模板是不同的,并且继续被区别对待。
无论如何,在像示例中那样的简单场景中,C ++ 17都会假设您的意思,并且不再需要<>
。
更多详细信息: