c++ - 如何使用类的模板参数作为类成员的模板参数?

标签 c++ templates

我正在尝试用 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/

相关文章:

c++ - CaptureStackBackTrace 是单线程的吗?

c++ - 从长字符串中删除一个字符

templates - 如何覆盖 MATLAB 中的默认文本

php - 带有逻辑和 html 输出的循环应该放在模型中还是 View 中?

c++ - Koenig Lookup 的奇怪行为

c++ - Gecko XPCOM 用法与 WebKit

C++ - 为什么可以在复制构造函数中直接访问传递的对象的私有(private)变量?

c++ - 如何在 std::multimap 中返回严格小于给定键的最大键?

c++ - 通过模板化运算符重载将 std::complex<T> 乘以 double

c++ - 是否可以用模板函数替换两个相似的成员函数?