Специализация шаблонной функции шаблонного класса

Тема в разделе "LANGS.C", создана пользователем _DEN_, 9 май 2009.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Код (Text):
    1. template <class T>
    2. struct foo
    3. {
    4.     template <class U>
    5.     U boo();
    6. };
    7.  
    8. template <class T>
    9. template <>
    10. int foo<T>::boo<int>()
    11. {
    12.     return 0;
    13. }
    14.  
    15. int main()
    16. {
    17.     foo<char> f;
    18.  
    19.     int i = f.boo<int>();
    20.     return 0;
    21. }
    Код (Text):
    1. "ComeauTest.c", line 9: error: a template declaration containing a template
    2.           parameter list may not be followed by an explicit specialization
    3.           declaration
    4.   template <>
    5.             ^
    6.  
    7. 1 error detected in the compilation of "ComeauTest.c".
    Почему так, и существует ли обходной маневр?
     
  2. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Уточню - нужно сохранить семантику перегрузки по возвращаемому значению.
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Сам спросил - сам ответил (часть 2)

    Код (Text):
    1. template <class T>
    2. struct foo
    3. {
    4.     template <class U>
    5.     U boo();
    6.  
    7.     void boo(int& val);
    8.     void boo(char& val);
    9. };
    10.  
    11. template <class T>
    12. template <class U>
    13. U foo<T>::boo()
    14. {
    15.     U u = U();
    16.     boo(u);
    17.     return u;
    18. }
    19.  
    20. template <class T>
    21. void foo<T>::boo(int& val)
    22. {
    23.     val = 1;
    24. }
    25.  
    26. template <class T>
    27. void foo<T>::boo(char& val)
    28. {
    29.     val = 'a';
    30. }
    31.  
    32. int main()
    33. {
    34.     foo<char> f;
    35.  
    36.     int i = f.boo<int>();
    37.     char c = f.boo<char>();
    38.     return 0;
    39. }
    Остается неясным, почему нельзя делать как в первом примере. nop_, заквотишь Стандарт? :)
     
  4. nop_

    nop_ New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2007
    Сообщения:
    61
    14.7.3/18: