当提到模板基类时,是否在任何地方都需要模板参数
Are template arguments required everywhere when mentioning a template base class?
这是一个简单的模板;
template <class T>
class tt {
private:
T x;
public:
tt() {x=0;};
Add(T p) {x += p;};
};
…然后是它的子类;
class cc : public tt<int> {
public:
cc() : tt() {};
};
这在VC中可以很好地编译,但在c++ Builder (XE)中不行,它会给出E2102错误。c++ Builder编译器需要在cc类的构造函数上使用以下语法进行编译:
cc() : tt<int>() {};
实际上,c++ Builder编译器需要每次在cc类中提到tt模板时都重复模板参数。
标准c++规范是否指定需要不断重复模板参数,还是c++ Builder编译器错误?
c++ Builder这里是错误的。在构造函数的成员初始化列表中使用祖先类名的原因与注入类名的概念有关。
当定义一个类时,编译器将类名插入到该类中,并使其引用自己。这个注入的名称允许你使用类的名称,而不需要在类内部使用模板参数。
template <class T>
struct tt {
// The compiler behaves as if there was the following.
// typedef tt<T> tt;
};
当您在成员初始化列表中使用名称tt
时,将查找这个注入的名称。
(根据记录,clang接受不带template参数的代码片段。)
附注:如果您将cc
定义为模板形参T
的类模板,并且祖先依赖于T
,则在cc
的构造函数的成员初始化列表中不会找到名称tt
。
template <class T>
class cc : tt<T> {
cc()
: tt<T>() /* You must use <T> here. */
{
}
};
您可以使用typedef:
来避免重复。typedef tt<int> tti;
…
class cc : public tti {
public:
cc() : tti() {};
};
相关文章:
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 用于检查值是否为其任何参数的帮助程序函数
- C++ - 声明指向返回任何类型并获取任意数量参数的函数的指针
- 错误:参数中无效地使用了无效表达式
- 如何制作可以接受任何类型的参数的 std::函数和 lambda
- 如何使用 std::forward 精确地评估参数包的扩展?
- 有条件地将默认参数传递给函数(使用"?"运算符)
- MSVC 错误:4 个重载中的任何一个都无法转换所有参数类型
- 可变参数函数模板不能很好地使用 std::function 作为参数
- boost::p rogram_options 在指定意外的位置参数时不报告任何错误
- 如何成功地将函数对象(或lambda)传递给trackbar回调的第二个参数(void*)
- 如何正确地将 boost::optional<std::chrono::d uration> 作为函数参数?
- 如何显式地将某些模板化输入作为参数?
- 部分专用化不使用其任何模板参数
- 重构许多函数以优雅地接收任何类型的参数(模板<any>)
- 将字符串(或任何其他参数)传递到QWidget构造函数
- 使用 boost::bind 但允许传递任何其他参数
- 当部分专用化参数不使用其任何模板参数时,哪些规则适用
- 如何使用信号来执行任何带参数的函数
- 通过IDispatch公开COM函数的服务器如何区分调用函数而不传递任何ID参数的不同客户端?