Как получить объект c ++ с методом, который принимает аргумент вмещающего класса? - PullRequest
1 голос
/ 02 апреля 2012

Я пытаюсь выяснить, есть ли какой-нибудь известный шаблон / идиома в c ++ для того, что я пытаюсь сделать здесь. Класс A должен состоять из объекта, имеющего функцию, аргумент которой также должен иметь тип A. Следующий код не компилируется, поскольку typeid нельзя использовать в константном выражении. Какие-либо предложения?

#include <iostream>
#include <typeinfo>
using namespace std;

template <typename T>
struct B { 
  int f(T& i) { cout << "Hello\n"; } 
};

class A {
  B<typeid(A)> b;
};

int main()
{ 
  A k;
}

Ответы [ 2 ]

1 голос
/ 02 апреля 2012

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

#include <iostream>

class A; // forward declare A

struct B { 
  int f(A &i); // declaration only, definition needs the complete type of A
};

class A {
  B b;
};

int B::f(A &i) { std::cout << "Hello\n"; } // define f()

int main()
{ 
  A k;
}
0 голосов
/ 02 апреля 2012

Вы ищете B<A> b; Следующая программа компилируется без ошибок или предупреждений на g ++ 4.4.3.

#include <iostream>
#include <typeinfo>
using namespace std;

template <typename T>
struct B {
  int f(T& i) { cout << "Hello\n"; return 0; }
};

class A {
public:
  B<A> b;
};

int main()
{
  A k;
  return k.b.f(k);
}

Примечание : Если вы используете шаблоны только для того, чтобы избежать предварительного объявления, мое решение неверно. Но я оставлю это здесь, если вы используете шаблоны по какой-либо другой законной причине.

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