如何解决如何使用类的模板参数作为类成员的模板参数?
| 我正在尝试在C ++中实现以下功能:template <class T>
class Inner
{
public:
Inner(T inData){data = inData;};
~Inner(void){};
T data;
};
template <class T>
class Outer
{
public:
Outer(Inner<T> in){inner = in;};
~Outer(void){};
Inner<T> inner;
};
int main(void)
{
Inner<int> in (10);
Outer<int> out (in);
std::cout << out.inner.data;
}
在MSVS 2010中进行编译时,出现以下错误:
c:\\...\\main.cpp(15): error C2512: \'Inner<T>\' : no appropriate default constructor available
with
[
T=int
]
c:\\users\\gaff\\documents\\visual studio 2010\\projects\\pgp(c++)\\pgp(c++)\\main.cpp(15) : while compiling class template member function \'Outer<T>::Outer(Inner<T>)\'
with
[
T=int
]
c:\\users\\gaff\\documents\\visual studio 2010\\projects\\pgp(c++)\\pgp(c++)\\main.cpp(24) : see reference to class template instantiation \'Outer<T>\' being compiled
with
[
T=int
]
显然,我在这里缺少一些基本的了解,但是我不知道如何解决此问题,即使我试图实现的目标也是可能的。
对于它的价值,这是一个可以毫无问题地进行编译的Java实现:
public class Inner<T> {
public T data;
public Inner(T inData) {
data = inData;
}
}
public class Outer<T> {
public Inner<T> inner;
public Outer(Inner<T> in) {
inner = in;
}
}
public class Main {
public static void main(String args[]){
Inner<Integer> in = new Inner<Integer>(10);
Outer<Integer> out = new Outer<Integer>(in);
System.out.println(out.inner.data);
}
}
有什么建议么?
干杯
吉米迪·乔
解决方法
问题是您没有内部的默认构造函数。编译器初始化对象时,将在赋值之前调用默认的构造函数
inner
。
编辑:
正确实现一个复制构造函数,而不是像下面这样初始化inner可能是一个好主意:
Outer(Inner<T> in) : inner(in) { };
您可以像这样使用复制构造函数:
Inner(const Inner<T> & in) : data(in.data){
}
, 您需要在构造函数中使用初始化程序列表:
Outer(Inner<T> in): inner(in) {}
否则,构造函数必须在进入构造函数之前对其内部进行默认构造。这是不可能的,因为没有默认的构造函数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。