2011-07-27 12 views
1

vc6の第3版でプログラムをコンパイルしようとしています。 3人の友人機能がプライベートメンバーにアクセスできないことがわかります。私は、フレーズチェックを渡すことができないので、フレンド関数宣言でオペレータ==の後に<>を削除しました。テンプレートフレンド機能がプライベートメンバーにアクセスできない

これはよく知られている問題かもしれませんが、友人の関数名の不一致が原因と思われるかもしれませんが、修正方法はわかりません。親切に私にこれを手伝ってください。おかげで コードは以下の通りです:

// Program to test slices and a simple N*M matrix class 

// pp 670-674 and 683-684 

// No guarantees offered. Constructive comments to [email protected] 


#include<iostream> 
#include<valarray> 
#include<algorithm> 
#include<numeric> // for inner_product 
using namespace std; 

// forward declarations to allow friend declarations: 
template<class T> class Slice_iter; 
template<class T> bool operator==(const Slice_iter<T>&, const Slice_iter<T>&); 
template<class T> bool operator!=(const Slice_iter<T>&, const Slice_iter<T>&); 
template<class T> bool operator< (const Slice_iter<T>&, const Slice_iter<T>&); 

template<class T> class Slice_iter { 
    valarray<T>* v; 
    slice s; 
    size_t curr; // index of current element 

    T& ref(size_t i) const { return (*v)[s.start()+i*s.stride()]; } 
public: 
    Slice_iter(valarray<T>* vv, slice ss) :v(vv), s(ss), curr(0) { } 

    Slice_iter end() const 
    { 
     Slice_iter t = *this; 
     t.curr = s.size(); // index of last-plus-one element 
     return t; 
    } 

    Slice_iter& operator++() { curr++; return *this; } 
    Slice_iter operator++(int) { Slice_iter t = *this; curr++; return t; } 

    T& operator[](size_t i) { return ref(i); }  // C style subscript 
    T& operator()(size_t i) { return ref(i); }  // Fortran-style subscript 
    T& operator*() { return ref(curr); }   // current element 

    friend bool operator==(const Slice_iter<T>& p, const Slice_iter<T>& q); 
    friend bool operator!=(const Slice_iter<T>& p, const Slice_iter<T>& q); 
    friend bool operator< (const Slice_iter<T>& p, const Slice_iter<T>& q); 

}; 


template<class T> 
bool operator==(const Slice_iter<T>& p, const Slice_iter<T>& q) 
{ 
    return p.curr==q.curr && p.s.stride()==q.s.stride() && p.s.start()==q.s.start(); 
} 

template<class T> 
bool operator!=(const Slice_iter<T>& p, const Slice_iter<T>& q) 
{ 
    return !(p==q); 
} 

template<class T> 
bool operator<(const Slice_iter<T>& p, const Slice_iter<T>& q) 
{ 
    return p.curr<q.curr && p.s.stride()==q.s.stride() && p.s.start()==q.s.start(); 
} 

私はコメントに多くのテキストを追加することができないので、私はVS2008で、いくつかのエラーを掲載しました。以前のエラーはvc6によるものであることは間違いありません。ありがとうございます。 完全なコードはここにあります:http://www2.research.att.com/~bs/matrix.cそれらの構文エラーはfriend関数に関連していないようですが、数値のinner_productです。 のVisual Studio 2008の下にいくつかのエラーメッセージ:クラス定義内のフレンドとして宣言しながら、

1>c:\vc2008\vc\include\xutility(764) : error C2039: 'iterator_category' : is not a member of 'Cslice_iter<T>' 
1>  with 
1>  [ 
1>   T=double 
1>  ] 
1>  c:\vc2008\vc\include\numeric(106) : see reference to class template instantiation 'std::iterator_traits<_Iter>' being compiled 
1>  with 
1>  [ 
1>   _Iter=Cslice_iter<double> 
1>  ] 
1>  k:\c++\valarray0.cpp(245) : see reference to function template instantiation 'double std::inner_product<Cslice_iter<T>,_Ty*,double>(_InIt1,_InIt1,_InIt2,_Ty)' being compiled 
1>  with 
1>  [ 
1>   T=double, 
1>   _Ty=double, 
1>   _InIt1=Cslice_iter<double>, 
1>   _InIt2=double * 
1>  ] 
1>c:\vc2008\vc\include\xutility(764) : error C2146: syntax error : missing ';' before identifier 'iterator_category' 
1>c:\vc2008\vc\include\xutility(764) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>c:\vc2008\vc\include\xutility(764) : error C2602: 'std::iterator_traits<_Iter>::iterator_category' is not a member of a base class of 'std::iterator_traits<_Iter>' 
1>  with 
+3

"vc6"はMicrosoft Visual C++ 6を指しますか?そのコンパイラは、言語標準よりも数年先行しており、特にテンプレートを使用する場合は、多くの有効なコードをコンパイルできません。あなたは今世紀のコンパイラではるかに良いでしょう。 –

+0

私はVisual Studio 2008を試しましたが、さらに多くのエラーが発生しました。 – shangping

+0

おそらくあなたはそれらのエラーを投稿できますか?私がGCC上で私のためにきちんとコンパイルします。あなたが取り除いたテンプレート指定子を元に戻します。 –

答えて

3

あなたはtypeパラメータを指定する必要があります。

また、クラススコープ内のSlice_Iterが暗黙的に型パラメータを持つため、Slice_iter<T>を指定する必要はありません。

friend bool operator==<T>(const Slice_iter& p, const Slice_iter& q); 
friend bool operator!=<T>(const Slice_iter& p, const Slice_iter& q); 
friend bool operator< <T>(const Slice_iter& p, const Slice_iter& q); 
+0

私が私の質問で述べたように、もしこれを追加すると、vc6で多くの構文エラーが発生します。不足している;前に<.... – shangping

+6

ちょうどvc6を使用しない –

+0

@shangping:VC6は*古代*です。 VC6コンパイラにC++コードを書いても気にしないでください。 VC7にC++コードを書き込まないでください。少なくともVC8を使用してください(VC9またはVC10も同様に動作します)。 VC6やVC7よりもはるかに規格に準拠しています。 –

関連する問題