Mam taką klasę:

// 12.2

#ifndef twelve_two_h
#define twelve_two_h

#include <iostream>

class String
{
	private:
		char * str;
		int len;
		static int num_strings;
		static const int CINLIM = 80;
	public:
		String(const char * s);
		String();
		String(const String & s);
		~String();
		int lenght() const {return len;}
		void stringlow();
		void stringup();
		int has(char c) const;
		String & operator=(const String & s);
		String & operator=(const char * s);
		char & operator[](int i);
		const char & operator[](int i) const;
		String operator+(const String & st) const;
		friend bool operator<(const String & st1, const String & st2);
		friend bool operator>(const String & st1, const String & st2);
		friend bool operator==(const String & st1, const String & st2);
		friend String operator+(const char * s, const String & st);
		friend std::ostream & operator<<(std::ostream & os, const String & st);
		friend std::istream & operator>>(std::istream & is, String & st);
		static int HowMany();
};

#endif 

i chodzi mi o funkcję zaprzyjaźnioną, przeciążającą operator+

String operator+(const char * s, const String & st)
{
	String temp;
	
	delete [] temp.str;
	temp.len = std::strlen(s) + std::strlen(st.str);
	temp.str = new char [temp.len + 1];
	std::strcpy(temp.str, s);
	std::strcat(temp.str, st.str);
	
	return temp;
}

Komilator wypluwa coś takiego:

D:\cpp\cw>g++ -Wall 12.2.cpp 12.2.main.cpp
12.2.h: In function 'String operator+(const char*, const String&)':
12.2.h:11:10: error: 'char* String::str' is private
12.2.cpp:136:17: error: within this context
12.2.h:12:7: error: 'int String::len' is private
12.2.cpp:137:7: error: within this context
12.2.h:11:10: error: 'char* String::str' is private
12.2.cpp:137:45: error: within this context
12.2.h:11:10: error: 'char* String::str' is private
12.2.cpp:138:7: error: within this context
12.2.h:12:7: error: 'int String::len' is private
12.2.cpp:138:28: error: within this context
12.2.h:11:10: error: 'char* String::str' is private
12.2.cpp:139:19: error: within this context
12.2.h:11:10: error: 'char* String::str' is private
12.2.cpp:140:19: error: within this context
12.2.h:11:10: error: 'char* String::str' is private
12.2.cpp:140:27: error: within this context

Mówi, że nie mogę dla obiektu temp używać jego składowych prywatnych. Ale czemu, przecież to funkcja zaprzyjaźniona?

ps.
Co ciekawe, Visual C++ 2010 EE nie wykrywa błędów, tylko g++ się czepia...