2015-05-12 25 views
0

當提供operator<<模板類的專業化,鐺喜歡的朋友內嵌形式:提供適當的運算符<<與可變參數模板專業化

#include <iostream> 

template <typename A, typename... Bs> 
struct Hello; 

template <typename A> 
struct Hello<A> { 
    template <typename A2> 
    friend std::ostream & operator<<(std::ostream & s, const Hello<A2> & h) { 
    return s << "specialized\n"; 
    } 
}; 

template <typename A, typename... Bs> 
struct Hello { 
    template <typename A2, typename... B2s> 
    friend std::ostream & operator<<(std::ostream & s, const Hello<A2,B2s...> & h) { 
    return s << "generic\n"; 
    } 
}; 


int main() 
{ 
    std::cout << Hello<int>() 
      << Hello<float>() 
      << Hello<int,int>() 
      << Hello<int,float>(); 
} 

http://coliru.stacked-crooked.com/a/47743db96c0f3a02

但是GCC失敗的是,它更喜歡非在線版本:

#include <iostream> 

template <typename A, typename... Bs> 
struct Hello; 

template <typename A> 
struct Hello<A> { 
    template <typename A2> 
    friend std::ostream & operator<<(std::ostream & s, const Hello<A2> & h); 
}; 

template <typename A, typename... Bs> 
struct Hello { 
    template <typename A2, typename... B2s> 
    friend std::ostream & operator<<(std::ostream & s, const Hello<A2,B2s...> & h); 
}; 


template <typename A2> 
std::ostream & operator<<(std::ostream & s, const Hello<A2> & h) { 
    return s << "specialized\n"; 
} 

template <typename A2, typename... B2s> 
std::ostream & operator<<(std::ostream & s, const Hello<A2,B2s...> & h) { 
    return s << "generic\n"; 
} 


int main() 
{ 
    std::cout << Hello<int>() 
      << Hello<float>() 
      << Hello<int,int>() 
      << Hello<int,float>(); 
} 

http://coliru.stacked-crooked.com/a/45328f7bbdb36598

而這又不被叮噹接受。

所以我的問題是:

  1. 都是形式標準C++?
  2. 是否有一種表單被編譯器接受?
+1

某種聯繫:http://stackoverflow.com/questions/1297609/overloading-friend-operator-for-template-class – DarioP

回答

2

你不需要模板的朋友。

template <typename A, typename... Bs> 
struct Hello { 
    friend std::ostream & operator<<(std::ostream & s, const Hello<A,Bs...> & h) { 
    return s << "generic\n"; 
    } 
}; 

template <typename A> 
struct Hello<A> { 
    friend std::ostream & operator<<(std::ostream & s, const Hello<A> & h) { 
    return s << "specialized\n"; 
    } 
}; 

http://coliru.stacked-crooked.com/a/22c439bc920f948c