简体   繁体   中英

Declaring a class template as a friend of a class template in C++

I'm trying to declare a class template as a friend of another class template, so the private members in one class can be accessed by the other. For example I have two classes as the following:

A.h
template <typename T>
class A {
    private:
       T content;
}

and

B.h
#include "A.h"
template <typename T>
class B {
    public:
        void add(T);

    private:
        A<T>* ptr;
}

Now, I want to make class B< T> a friend of class A< T>, so I can have access to class A< T>'s content through class B< T>'s function add. So, I added a few lines to Ah:

A.h
template <typename T> class B;
template <typename T> 
class A {
    friend class B<T>;
    ...

I'm using Visual Studio and the above code would give me "unresolved external symbol..." error (Error code LNK2019). I have tried other variations but I kept getting a linker error. Please help me out. Thank you.

The definitions for the function add(T) is in B.cpp which I didn't write in the post.

The following code builds fine on gcc. I added a definition of B<T>::add(T) , as it was missing. It's very possible that the absence caused your link - not compilation! - error .

template<typename T>
class B;

template <typename T>
class A {
    private:
       T content;

    friend B<T>;
};

template <typename T>
class B {
    public:
        void add(T t) { A<T> a; a.content = t; }

    private:
        A<T>* ptr;
};

int main() {
    A<int> a;
    B<int> b;
    b.add(3);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM