Как я могу использовать параметр шаблона класса в качестве параметра шаблона члена класса? - PullRequest
2 голосов
/ 01 июня 2011

Я пытаюсь реализовать следующее в 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);
    }
}

Есть предложения?

Приветствия

JimmidyJoo

Ответы [ 2 ]

3 голосов
/ 01 июня 2011

Проблема в том, что у вас нет конструктора по умолчанию для inner.Когда компилятор инициализирует объект, он вызывает конструктор по умолчанию inner перед присваиванием.

РЕДАКТИРОВАТЬ:

Вероятно, это хорошая идея, чтобы правильно реализовать конструктор копирования и вместо этого инициализировать внутренний следующим образом:

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

Вы можете использовать конструктор копирования следующим образом:

Inner(const Inner<T> & in) : data(in.data){
}
2 голосов
/ 01 июня 2011

Вам нужно использовать список инициализатора в конструкторе:

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

в противном случае конструктор должен по умолчанию создать внутреннюю структуру, прежде чем он попадет в конструктор. Это невозможно, так как нет конструктора по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...