2013-05-15 6 views
0

У меня есть вопрос относительно this код, написанный @GManNickG.Друг функции шаблона недоступны для частных лиц

Я собирался увидеть если я действительно понял, что происходит, поэтому я отредактировал print_binary_helper «s другу функции, как это (оригинальный код был прокомментирован):

//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); 

использовать T вместо U но программа не будет компилироваться. Может ли кто-нибудь объяснить мне, что я сделал не так, и если это возможно, и если да, то как это можно сделать?

Я использую 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>   ] 
+0

отлично работает на g ++ 4.7.2 –

ответ

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.

Эти два варианта. Таким образом, в вашем случае. Функция шаблона не является другом и функция без шаблона не определена. Вы не получаете никаких ошибок, потому что вы не используете без шаблона print_binary в любом месте.

Функции друзья. Поэтому они не должны зависеть от аргумента шаблона класса. Они должны быть независимыми функциями.


Если вы хотите сделать только T специализации этих функций друзей T специализаций print_binary_helper класса вы можете переадресовать объявить функции, а затем speicalize их, как вы делали в классе с незначительными изменениями. Что-то вроде этого.

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.

+0

Спасибо! Это помогло мне, используя пример использования функции friend с шаблоном. Я думаю, что у меня книга устарела. – AutonomousApps

Смежные вопросы