如何使用类的模板参数作为类成员的模板参数

How can I use the template parameter of a class as the template parameter of a class member?

本文关键字:参数 成员 何使用      更新时间:2023-10-16

我正试图在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:usersgaffdocumentsvisual studio 2010projectspgp(c++)pgp(c++)main.cpp(15) : while compiling class template member function 'Outer<T>::Outer(Inner<T>)'
          with
          [
              T=int
          ]
          c:usersgaffdocumentsvisual studio 2010projectspgp(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);
    }
}

有什么建议吗?

干杯

JimmidyJoo

问题是您没有内部的默认构造函数。当编译器初始化对象时,它会在赋值之前调用inner的默认构造函数。

编辑:

正确地实现复制构造函数并初始化内部可能是个好主意,如下所示:

Outer(Inner<T> in) : inner(in) { };

你可以这样使用复制构造函数:

Inner(const Inner<T> & in) : data(in.data){
}

您需要在构造函数中使用初始值设定项列表:

Outer(Inner<T> in): inner(in) {}

否则,构造函数在进入构造函数之前必须默认构造内部。这是不可能的,因为没有默认的构造函数。