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;}
};
Asked
Active
Viewed 446 times
0
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 Answers
-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, согласен со всеми пунктами кроме 3 и 4 частично. В третьем у него по факту есть тело хоть и пустое. И по четвертому,например, одна из перегрузок оператора ввода/вывода дружественная. Тоже плохая архитектура? На счет пользовательских классов - согласен злоупотребление friend это не хорошо, но и отказываться от них не стоит. – Kirill21 Jun 16 '16 at 08:59
-
@Dec реализацию шаблона просто невозможно засунуть в CPP, на то она и шаблон - ее текст должен быть доступен в момент компиляции конкретного cpp – gbg Jun 16 '16 at 11:59
-
-