функция шаблона друг класса шаблона с тем же типом - PullRequest
0 голосов
/ 05 апреля 2011

В приведенном ниже коде, очевидно, есть внешняя сторона, и он был бы признателен, если бы кто-то мог указать, как этого можно избежать.

Спасибо

1> ------ Начата сборка: проект: Ch16, конфигурация: отладка Win32 ------1> p657_b_print.cpp1> p657_b_main.obj: ошибка LNK2019: неразрешенный внешний символ «void __cdecl Сравнение (int &, класс Car &)» (?? $ сравнить @ H @@ YAXAAHAAV? $ Car @ H @@@ Z) упоминается в функции _main1> \ na-13 \ мои документы \ visual studio 2010 \ Projects \ Ch16 \ Debug \ Ch16.exe: фатальная ошибка LNK1120: 1 неразрешенный внешний код========== Построение: 0 выполнено, 1 не выполнено, 0 обновлено, 0 пропущено ==========

p657_b.h :

#ifndef P657H
#define P657H

template< class T> class Car; 
template<class T1> void  compare(T1&, Car<T1>&);

template< class T> class Car { 
    friend void  compare<T> (T&, Car<T>&);

private:
    T Wheels;

public:
    Car(): Wheels(4)  {}
    Car(T);
};

#include "p657_b.cpp"
#include "p657_b_print.cpp"

#endif

p657_b.cpp :

#ifndef P643CC
#define P643CC

#include <iostream>
#include <string>
using std::string;
using std::cout;
using std::endl;
#include "p657_b.h"

template<class T> Car<T>::Car(T w) {
    Wheels = w;
}
#endif

p657_b_print.cpp :

#ifndef p657_CC
#define p657_CC
#include "p657_b.h"
#include<iostream>
using namespace std;

template <class T>
void compare(T &iv1, Car<T> &c1) {
    cout << iv1 << endl;
    cout << c1.Wheels << endl;
}

#endif

p657_b_main.cpp :

#include "p657_b.h"
#include<iostream>
#include<string>
using namespace std;

int main()
{
    Car<int> myCar;
    int iv = 5;
    compare(iv, myCar);

    return 0;
}

1 Ответ

1 голос
/ 06 апреля 2011

Определение всего шаблона должно быть в одном файле.Вы должны объединить _b.cpp и _b.h и включить полный шаблон в вашу программу.

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