Forward declaration with friend function: invalid use of incomplete type
Asked Answered
B

3

7
#include <iostream>

class B;

class A{
 int a;
public:
 friend void B::frndA();
};

class B{
 int b;
public:
 void frndA();
};

void B::frndA(){
 A obj;
 std::cout << "A.a = " << obj.a << std::endl;
}

int main() {
 return 0;
}

When trying to compile this code, some errors occurred. E.g.

invalid use of incomplete type

What are the problems in this code?

Backhouse answered 6/7, 2010 at 5:30 Comment(1)
I've retagged the question. friend isn't one of the most helpful keywords. Also forward-declaration makes more sense when combined in one tag. Edit: Oh and class also makes more sense then function I guess :)Leffler
I
3

Place the whole of the class B ... declaration before class A. You haven't declared B::frndA(); yet.

#include <iostream>
using namespace std;

class B{
    int b;
public:
    void frndA();
};

class A{
    int a;
public:
    friend void B::frndA();
};



void B::frndA(){
    A obj;
    //cout<<"A.a = "<<obj.a<<endl;
}

int main() {
    return 0;
}
Infrastructure answered 6/7, 2010 at 5:35 Comment(0)
P
3

The problem is you can't friend a member function before the compiler has seen the declaration.

You are going to need to rearrange your code to solve the problem (i.e. move the definition of class B prior to class A).

Philender answered 6/7, 2010 at 5:37 Comment(0)
L
2

You need to put the declaration of B before A. The compiler doesn't know about this: B::frndA(). A forward declaration is not enough information to infer what members the type has.

I would recommend to put your class A declaration in a file A.h and it's definition inside a file A.cpp. Likewise the same for the type B inside of B.h and B.cpp

At the top of each header file put #pragma once (or if you prefer include guards).

Then inside your B.h you can simply include A.h.

Lenes answered 6/7, 2010 at 5:35 Comment(2)
In fact, pragma once can fail when the same file falls within different search paths since it's based on the path and not on the content of the file.Hyracoid
pragma once is supported by all major compilers. I don't think #pragma once warrants the down vote. See here: #1144436Lenes

© 2022 - 2024 — McMap. All rights reserved.