Насколько сложно определить шаблон функции-друга для шаблона класса
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Насколько сложно определить шаблон... Expand / Collapse
Автор
Сообщение
08.12.2006 21:56
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 08.12.2006 21:45
Сообщ.: 5, Visits: 47
У меня есть класс типа :
template <class T>
class array
{
...
    friend std::ostream& operator<<
        (
            std::ostream& output,
            const array<T>&
        );
...
};

(Полный код в аттачменте - это слегка модифицированный пример 19.4 из книжки Джеса Либерти "Освой самостоятельно C++ за 21 день". Я компилил Visual C++ 13.10.3077 (VS2003) компилятором с ключами /EHsc /Zc:forScope. Обратите внимание, что если вводить исходные данные таким образом, что вместо двух цифр ввести одну, а потом сразу делимитер (пробел, таб, запятая, семиколон или точка), то функция std::string::at () вызывает out of range exception, и программа падает)

Проблема в том, что если определить объявленный другом класса array operator<< как шаблон функции следующим образом:

template <class T>
std::ostream& operator<< 
    (
        std::ostream& output,
        const array<T>& rhs
    )
{
    // loop invariant: the first i + 1 members of array
    // put into output buffer
    for (int i = 0; i < rhs.getSize (); ++i)
        output << '[' << i
            << "] " << rhs[i] << std::endl;
    return output;
}
,
т.е. чтобы он мог вызываться для любого экземпляра класса array, то программа компилируется, но не линкуется. Сообщение компоновщика следующее:
List19_4.obj : error LNK2019: unresolved external symbol "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class array<class animal> const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABV?$array@Vanimal@@@@@Z) referenced in function _main
List19_4.obj : error LNK2019: unresolved external symbol "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class array<int> const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABV?$array@H@@@Z) referenced in function _main
Debug/List19_4.exe : fatal error LNK1120: 2 unresolved externals

В результате я закомментил в файле вышеуказонное определение шаблона оператора << и просто определил два перегруженных оператора << - для параметра array<int> и для array<animal> соответственно. А как правильно определить именно шаблон для оператора << чтобы работал с любым array<T>?


  Post Attachments 
List19_4.zip (0 views, 3,20 KB)
Сообщ. #908699
« пред. тема | след. тема »


Эту тему читают Expand / Collapse
Посетители: 0 (0 гостей, 0 участников, 0 скрыт.участников)
Сейчас нет участников, просматривающих тему.
Модераторы: Alexey, boombastik, bazile, pl

Время GMT +3:00, Сейчас 10:44