0
class A{
public:
 template <typename T>
 void Log(T t);
};

class B
{
 A a;
 vector<C> vec;
 void func(){
  vec.push_back(C(int d)); 
  //a.Log(vec.back()); <-- проблема в этой строке
  }
};

class C{
public:
 int D;
 C(int d){D=d;}
};
Dec
  • 27
  • 1
    А тело метода A::Log() у вас где? – gbg Jun 16 '16 at 02:07
  • 1
    Простой ответ - поля и функции у классов по-умолчанию приватные, если явно не сделать их публичными, то они не будут видны извне. – insolor Jun 16 '16 at 06:42
  • @insolor верно, забыл указать, по факту A::Log() public. – Dec Jun 16 '16 at 08:38
  • Ну и второе a.Log< Тип_указать >(vec.back()); – nick_n_a Jun 16 '16 at 08:42
  • @nick_n_a Та же ошибка – Dec Jun 16 '16 at 08:56
  • @Dec попробуй тот код что я перезалил. у меня в vc++ 2015 работает. – Kirill21 Jun 16 '16 at 09:10
  • Вот на ideone https://ideone.com/8ozZfc правда там декларацию С пришлось поставить выше А и B. – Kirill21 Jun 16 '16 at 09:16

1 Answers1

-1
#include<iostream>
#include<vector>

class A {
public:
template <typename T>
void Log(T t)
{
    // это для себя сделал что бы хоть что-то выводить
    std::cout << (static_cast<C>(t)).getD();
}};

class C {
int D;
public:
int getD() { return D; }
C(int d) { D = d; }};

class B
{
 A a;
  std::vector<C> vec;
 public:
  void func(int d) {
    vec.push_back(C( d));
        a.Log(vec.back()); 
}};
int main()
{
   B obj;
     for (size_t i = 0; i <10; ++i)
    {
      obj.func(i);
    }
   system("pause");
}
Kirill21
  • 455
  • 1
  • 3
  • 13
  • У вас a.Log(vec.back()); шаблонный метод а в вашем вызове функции это не так. a.Log(vec.back()) вызывать нужно с заполнителем типа. Я вашей задачи не знаю, поэтому выправил код немного. void func(){ vec.push_back(C(int d)); } потому как такая функция доверия не вызывает если честно.если вдруг не понравятся модификаторы доступа public (хоть они и логичны, но у вас и почему-то не было,хотя вы вызывали private методы из других классов), то используйте friend -функции/классы. – Kirill21 Jun 16 '16 at 06:11
  • У вас все плохо с ответом.

    Первое - C++ умеет выводить параметры шаблона по сигнатуре функции, так что a.Log(vec.back()) не нужен, достаточно a.Log(vec.back()).

    Второе - у автора (и у вас) переставлены декларации B и С, это будет следующей ошибкой компиляции.

    Третье - единственная серьезная проблема автора - отсутствие тела у метода Log. Наверняка он засунул его в cpp, чего делать не следовало

    Четвертое - fried поля в классе - знак плохой архитектуры, не советуйте их.

    – gbg Jun 16 '16 at 06:50
  • @gbg, c закомментированным телом метода Log та же ошибка, поэтому и не указал – Dec Jun 16 '16 at 08:40
  • @gbg, а почему не следует засовывать реализацию в срр, логично же, не? – Dec Jun 16 '16 at 08:42
  • @gbg, согласен со всеми пунктами кроме 3 и 4 частично. В третьем у него по факту есть тело хоть и пустое. И по четвертому,например, одна из перегрузок оператора ввода/вывода дружественная. Тоже плохая архитектура? На счет пользовательских классов - согласен злоупотребление friend это не хорошо, но и отказываться от них не стоит. – Kirill21 Jun 16 '16 at 08:59
  • @Dec реализацию шаблона просто невозможно засунуть в CPP, на то она и шаблон - ее текст должен быть доступен в момент компиляции конкретного cpp – gbg Jun 16 '16 at 11:59
  • @Kirill21 у метода Log тела нет. Вместо тела там стоит точка с запятой. – gbg Jun 16 '16 at 12:00
  • @gbg, код был изменен . До этого у него было пустое тело. – Kirill21 Jun 16 '16 at 12:26