これは、2つのフレンド関数を含む、多数の演算子と関数を持つ文字列クラスであると想定されています。そして、コンパイラはプライベートメンバーにアクセスできないと言っているので、これら2つは私にいくつかの問題を引き起こします。これが私のstring.hです:
#include <iostream>
#ifndef STR_H
#define STR_H
namespace MyStr
{
class Str
{
private:
unsigned int length;
char *data;
public:
Str();
Str(const Str&);
Str(const char*);
Str(char c, unsigned int db);
~Str();
char* cStr() const;
unsigned int getLength() const;
ここには無関係な機能がたくさんあります...
friend int operator/ (const Str&, char);
friend std::ostream& operator<< (std::ostream&, const Str&);
};
}
#endif /* STR_H */
これがmain.cppです:
#include <iostream>
#include "Str.h"
using namespace std;
using namespace MyStr;
ostream& operator<< (ostream& out,const Str& str)
{
for (int i=0; i<str.length; i++)
{
out<<str.data[i];
}
out<<endl;
return out;
}
int operator/ (const Str& str, char c)
{
for (int i=0; i<str.length; i++)
{
if(str.data[i]==c) return i;
}
return -1;
}
このコードはコンパイルされず、コンパイラはStr
メンバーがプライベートであると主張します。
名前空間にもっと注意を払う必要があります。
class Str {
private:
unsigned int length;
char *data;
public:
Str(){}
Str(const Str&){}
Str(const char*){}
Str(char c, unsigned int db){}
// maybe something more...
friend int operator/ (const Str&, char);
friend std::ostream& operator<< (std::ostream&, const Str&);
};
ostream& operator<< (ostream& out,const Str& str)
{
for (int i=0; i<str.length; i++)
out<<str.data[i];
out<<endl;
return out;
}
int operator/ (const Str& str, char c)
{
for (int i=0; i<str.length; i++)
if(str.data[i]==c) return i;
return -1;
}
int main()
{
Str s;
cout<<s;
return 0;
}
名前空間が一致しないため、エラーが発生します。 MyStr
を使い続ける場合は、名前空間MyStr
をオーバーロードされたfriend演算子に追加する必要があります。これがあなたのやり方です:(演算子は名前空間MyStr
内で定義されるべきです)
namespace MyStr {
ostream& operator<< (ostream& out,const Str& str)
{
for (int i=0; i<str.length; i++)
{
out<<str.data[i];
}
out<<endl;
return out;
}
int operator/ (const Str& str, char c)
{
for (int i=0; i<str.length; i++)
{
if(str.data[i]==c) return i;
}
return -1;
}
}
Str
内でフレンド関数を宣言すると、それらはすぐに囲まれている名前空間MyStr
にあると見なされます。
定義する演算子はグローバル名前空間にあるため、コンパイラーは、これらが2つのまったく異なる演算子であり、フレンドではないと考えています。
追加することでこれを解決できます
namespace MyStr
{
}
.cppファイルの演算子の周り。