我正在尝试用 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
]
显然我在这里缺少一些基本的理解,但我不知道如何解决这个问题,或者即使我想要实现的目标是可能的。
就其值(value)而言,这是一个编译时没有任何问题的 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
的默认构造函数。
编辑:
正确实现复制构造函数并像这样初始化内部可能是一个好主意:
Outer(Inner<T> in) : inner(in) { };
您可以像这样使用复制构造函数:
Inner(const Inner<T> & in) : data(in.data){
}
关于c++ - 如何使用类的模板参数作为类成员的模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6195124/