首页 > 试题广场 >

代码可以通过编译吗?如果不能应该如何修改?

[单选题]
代码可以通过编译吗?如果不能应该如何修改?
template<class T> class Foo{
        T tVar;
    public:
        Foo(T t) : tVar(t) { }
};

template<class T> class FooDerived:public Foo<T>
{
};

int main()
{
    FooDerived<int> d(5);
    return 0;
}

  • 代码可以正确通过编译。
  • 编译错误,FooDerived是一个继承模板类的非模板类,它的类型不能改变。
  • 编译错误,tVal变量是一个不确定的类型。
  • 编译错误,可以在FooDerived类中添加一个构造函数解决问题。
推荐
当基类构造函数需要外部传递参数才能进行初始化时,派生类必须显式定义构造函数,为基类传递参数;基类如果不需要传递或者可以不传递参数,派生类可以不用显式定义构造函数。
编辑于 2015-12-14 11:10:28 回复(2)
在《C++primer》说过如果子类没有显示地调用父类的构造方法,则默认地调用父类的不带参数的构造方法,这里父类定义了带参数的构造方法,则默认构造函数失效了,需要调用显式地调用父类的构造方法
编辑于 2017-03-15 20:29:10 回复(1)
template<class T> 
class Foo{
T tVar;
public:
 Foo(T t) : tVar(t) { }
};
 
// 类FooDerived不必模板化,别思维定式了
class FooDerived: public Foo<int>{
public:
FooDerived():Foo<int>(12){
}
};

int main(){
        FooDerived d;
        return 0;
}
发表于 2015-09-06 16:18:34 回复(1)
派生类必须显示定义构造函数(且在构造函数的初始化列表中调用基类的构造函数),否则无法构造派生类的对象,没有合适的构造函数可以调用
发表于 2015-09-03 17:52:26 回复(4)
  D 
  template<class T> class Foo{
 T tVar;
 public:
  Foo(T t) : tVar(t) { }
 };
  
 template<class T> class FooDerived : public
  Foo<T>{
 public:
 FooDerived(T val):Foo<T>(val) {
  }
 };
  FooDerived<int> d(5);
  
编辑于 2015-06-26 20:38:25 回复(2)
我的理解是,如果基类不是默认构造函数,而是用参数列表来初始化基类对象,那么继承类必须显示定义构造函数并利用外部参数实现初始化。
发表于 2016-02-25 09:13:23 回复(0)
如果子类没有显示化的调用父类的构造函数,则调用父类不带参数的默认构造函数。这个题中的父类定义了带参数的构造函数,所以默认构造函数失效了,因此子类需要自己定义一个构造函数,否则编译报错。
发表于 2023-09-01 09:16:13 回复(0)
在《C++primer》说过如果子类没有显示地调用父类的构造方法,则默认地调用父类的不带参数的构造方法,这里父类定义了带参数的构造方法,则默认构造函数失效了,需要调用显式地调用父类的构造方法
发表于 2020-07-27 15:06:38 回复(0)
错误产生的原因是:定义类模板时,基类如果是需要参数的构造函数时,则须定义显式构造函数。而派生类继承有显式构造函数的基类时,派生类的构造函数也必须显式调用基类的构造函数。
发表于 2017-01-16 09:00:22 回复(0)
不会范型编程,需要进行进一步学习
发表于 2016-12-15 20:10:07 回复(0)
#include<iostream>
using namespace std;
template<class T>
class Foo{
    T tVar;
    public:
    Foo(T t):tVar(t){}
};
template<class T>
class FooDerived:public Foo<T>
{
    public:
        FooDerived(T val):Foo<T>(val){}
};
int main()
{
    FooDerived<int> d(5);
    return 0;
}
发表于 2022-11-14 14:16:56 回复(0)

酱紫

template 
class Foo {
  T tVar;
 public:
  Foo(T t) : tVar(t) {}
};
template 
class FooDerived : public Foo {
 public:
  FooDerived(T d) : Foo(d) {}
};
int main() {
  FooDerived d(5);
  return 0;
}
发表于 2022-04-09 16:00:41 回复(0)
派生类“继承”基类构造函数的方式是提供一条注明了(直接)基类名的using声明语句。
template<class T>class Foo {
    T tVar;
public:
    Foo(T t) :tVar(t) {}
};
template<class T>class FooDerived :public Foo<T> {
    using Foo<T>::Foo;
};
int main() {
    
    FooDerived<int>d(5);
    return 0;
}
发表于 2021-09-20 21:49:23 回复(0)
基类无默认构造函数
发表于 2021-05-01 09:28:58 回复(0)
当基类构造函数需要外部传递参数才能进行初始化时,派生类必须是显示定义构造函数,为基类传递参数;基类如果不需要传递或者可以不传递参数,派生类可以不用显示定义构造函数
发表于 2018-09-04 22:14:19 回复(0)
当基类构造函数需要外部传递参数才能进行初始化时,派生类必须显式定义构造函数,为基类传递参数;基类如果不需要传递或者可以不传递参数,派生类可以不用显式定义构造函数。
发表于 2017-07-31 17:44:30 回复(0)
1.基类重新写了构造函数,则默认的构造函数不起作用
2.派生类继承基类 假如没有在构造函数中指定调用基类的哪个构造函数,则调用默认,而这里FooDerived就是调用 Foo 的默认的Foo()
但却在Foo类中找不到这个默认的构造函数。
修改为:
template<classT> classFooDerived:publicFoo<T>
{
    public:
      FooDerived(T t):Foo(t){}
};

发表于 2016-10-09 16:28:12 回复(0)
我还以为是因为template导致的错误呢,原来是当基类构造函数需要传入参数的时候,派生类的构造函数不能再用默认的了,要给基类传进参数
发表于 2016-06-19 11:42:36 回复(0)
“FooDerived<T>::FooDerived”: 不能将参数 1 从“int”转换为“const FooDerived<T> &”
1>          with
1>          [
1>              T=int
1>          ]
1>          原因如下: 无法从“int”转换为“const FooDerived<T>”
1>          with
1>          [
1>              T=int
1>          ]
1>          无构造函数可以接受源类型,或构造函数重载决策不明确
发表于 2016-05-31 09:55:40 回复(0)
添加构造函数
template<class T>
class FooDerived:public Foo<T>
{
public:
    FooDerived(T t) : Foo<T>(t){}
};
发表于 2016-05-30 13:08:42 回复(0)
当基类构造函数需要外部传递参数才能进行初始化时,派生类必须显式定义构造函数,为基类传递参数;基类如果不需要传递或者可以不传递参数,派生类可以不用显式定义构造函数。
发表于 2016-05-21 13:09:31 回复(0)