0

@GManNickG によって書かれたこのコードについて質問があります。

何が起こっているのかを本当に理解しているかどうかを確認するつもりだったので、print_binary_helperのフレンド関数を次のように編集しました (元のコードにはコメントが付けられています)。

//template <typename U>
//friend print_binary_helper<U> print_binary(U value);
friend print_binary_helper<T> print_binary(T value);

//template <typename U>
//friend std::ostream& operator<<(std::ostream& sink,
//  const print_binary_helper<U> source);
friend std::ostream& operator<<(std::ostream& sink,
    const print_binary_helper<T> source);

//template <typename U>
//friend std::wostream& operator<<(std::wostream& sink,
//  const print_binary_helper<U> source);
friend std::wostream& operator<<(std::wostream& sink,
    const print_binary_helper<T> source);

U の代わりに T を使用しますが、プログラムはコンパイルされません。誰かが私に何が間違っていたかを説明してもらえますか?

私はVC++ 11を使用していますが、これは私が得るエラーです:

1>anything.cpp(68): error C2248: 'print_binary_helper<T>::print_binary_helper' : cannot access private member declared in class 'print_binary_helper<T>'
1>          with
1>          [
1>              T=int
1>          ]
1>          anything.cpp(31) : see declaration of 'print_binary_helper<T>::print_binary_helper'
1>          with
1>          [
1>              T=int
1>          ]
1>          anything.cpp(73) : see reference to function template instantiation 'print_binary_helper<T> print_binary<int>(T)' being compiled
1>          with
1>          [
1>              T=int
1>          ]
1>anything.cpp(68): error C2248: 'print_binary_helper<T>::print_binary_helper' : cannot access private member declared in class 'print_binary_helper<T>'
1>          with
1>          [
1>              T=unsigned __int64
1>          ]
1>          anything.cpp(31) : see declaration of 'print_binary_helper<T>::print_binary_helper'
1>          with
1>          [
1>              T=unsigned __int64
1>          ]
1>          anything.cpp(75) : see reference to function template instantiation 'print_binary_helper<T> print_binary<unsigned __int64>(T)' being compiled
1>          with
1>          [
1>              T=unsigned __int64
1>          ]
4

1 に答える 1

1
template <typename U>
friend print_binary_helper<U> print_binary(U value);

テンプレート 関数をprint_binary友達にします。

friend print_binary_helper<U> print_binary(U value);

非テンプレート 関数をprint_binary友達にします。

2つは異なります。したがって、あなたの場合、テンプレート関数は友達ではなく、非テンプレート関数は定義されていませんprint_binary非テンプレートをどこでも使用していないため、エラーは発生しません。

関数は友達です。したがって、クラスのテンプレート引数に依存するべきではありません。それらは独立した機能でなければなりません。


これらの関数の特殊化のみをクラスの特殊化とT友達にしたい場合は、関数を前方宣言してから、クラスで行ったようにマイナーな変更を加えてそれらを特殊化できます。このようなもの。Tprint_binary_helper

template <typename T>
class print_binary_helper;

template <typename T>
std::ostream& operator<<(std::ostream& sink,
                         const print_binary_helper<T> source);

template <typename T>
std::wostream& operator<<(std::wostream& sink,
                          const print_binary_helper<T> source);

template <typename T>
print_binary_helper<T> print_binary(T value);

template <typename T>
class print_binary_helper
{
public:
    static_assert(std::is_integral<T>::value,
                  "Cannot print non-integer in binary.");

    //make only  print_binary<T> a friend to print_binary_helper<T>
    friend print_binary_helper<T> print_binary<>(const T value);
                                //            ^^    

    friend std::ostream& operator<< <>(std::ostream& sink,
                                //  ^^
                                      const print_binary_helper<T> source);

    friend std::wostream& operator<< <>(std::wostream& sink,
                                //   ^^
                                     const print_binary_helper<T> source);

これExampleがその一部です。

于 2013-05-15T11:12:54.537 に答える