Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.01.2012, 20:22   #1
pinkiller
Форумчанин
 
Регистрация: 29.10.2011
Сообщений: 141
По умолчанию Новогодний гемморой студента

Описал шаблонный класс.
Код:
Box<int> Bi;
хочу создать объект этого класса.
Код:
Bi x(5);
C++ орет на меня за это матом и бьет по лицу.
Что делать?
pinkiller вне форума Ответить с цитированием
Старый 02.01.2012, 20:43   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от pinkiller Посмотреть сообщение
Описал шаблонный класс.
Код:
Box<int> Bi; //это не описание шаблонного класса.

хочу создать объект этого класса.
Код:
Bi x(5); //каким образом компилятор должен догадаться, 
           //какой именно тип параметра шаблона ему следует использовать
           // для создания объекта?
C++ орет на меня за это матом и бьет по лицу.
Что делать?
Например, научится приводить точный текст ошибок, который высвечивает компилятор. Ибо, что он там тебе конкретно пишет можно только догадываться. А телепаты в отпуске.

Последний раз редактировалось _Bers; 02.01.2012 в 20:47.
_Bers вне форума Ответить с цитированием
Старый 02.01.2012, 21:10   #3
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Код:
typedef Box<int> Bi;
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 02.01.2012, 22:09   #4
pinkiller
Форумчанин
 
Регистрация: 29.10.2011
Сообщений: 141
По умолчанию

описание шаблонного класса:
Код:
template <typename Type>
class Box{
	public: Type T;
			Type* Next;
			Box(){T=0; Next=NULL;}
			Box(int t){T=t; Next=NULL;}
			friend ostream& operator<<(ostream &, Type &){cout<<T;};
};
мейн:
Код:
void main() {
Box<int> Bi[10];
Bi[0].T=10;
cout<<Bi[0];
}
ошибка
Цитата:
binary '<<' : no operator found which takes a right-hand operand of type 'Box<Type>' (or there is no acceptable conversion)
Вопрос: НУ пачиму!? Я же перегрузил...
pinkiller вне форума Ответить с цитированием
Старый 02.01.2012, 22:51   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

friend ostream& operator<<(ostream &, Type &){cout<<T;};

1. Почему в аргументах функции отсутствуют имена переменных?
2. Почему статик функция находится внутри класса без соответствующего модификатора?

Лекарство:
1. оставить внутри класса только прототип функции.
2. Реализацию функции вынести в глобальное пространство.
3. Выучить тему "как правильно объявляются прототипы функций. И как правильно объявляются реализации функций."
_Bers вне форума Ответить с цитированием
Старый 03.01.2012, 11:32   #6
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

_Bers

2. Почему статик функция находится внутри класса без соответствующего модификатора?

потому что это не статик-функция :oops:

pinkiller

Вопрос: НУ пачиму!? Я же перегрузил...

читай сообщение об ошибке: у тебя нет перегруженного оператора <<, который бы принимал объект класса Box<Type>
Rififi вне форума Ответить с цитированием
Старый 03.01.2012, 11:42   #7
pinkiller
Форумчанин
 
Регистрация: 29.10.2011
Сообщений: 141
По умолчанию

Rififi ааа!! Дошло) Пасиба) тяжко конечно но сделал)
pinkiller вне форума Ответить с цитированием
Старый 03.01.2012, 17:28   #8
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Rififi Посмотреть сообщение
_Bers

2. Почему статик функция находится внутри класса без соответствующего модификатора?

потому что это не статик-функция ops:
То есть, вы считаете, что бинарные операторы не обязаны быть статиками? И их можно сделать мемберами классов, да?

Заставьте этот код работать:

Код:
struct Test
{
    int a;
    //Test& operator+(Test& left, Test& right) { left.a +=right.a; return *this; }
    //: error C2804: бинарный 'operator +' имеет слишком много параметров

    //static Test& operator+(Test& left, Test& right) { left.a +=right.a; return *this; }
    //: error C2801: 'Test::operator +' не должен быть статическим членом

    Test& operator+(const Test& crc) { a +=crc.a; return *this; } //заработал только так
};
Корректность не имеет значение. Главное - что бы метод оставался мембером, причем - бинарным.

зы: код иллюстрирует, что бинарные перегрузки компилятор даже статик-мемберами сделать не позволяет.
_Bers вне форума Ответить с цитированием
Старый 03.01.2012, 17:54   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
То есть, вы считаете, что бинарные операторы не обязаны быть статиками? И их можно сделать мемберами классов, да?
давайте вы не будете утверждать что операторы не имеют права быть членами класса
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.01.2012, 18:14   #10
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
давайте вы не будете утверждать что операторы не имеют права быть членами класса
Я утверждаю, что бинарные операторы не имеют права быть членами класса.

Если вы утверждаете обратное - пример в студию
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Новогодний хранитель экрана made in programmersforum.ru _PROGRAMM_ Gamedev - cоздание игр: Unity, OpenGL, DirectX 11 05.01.2012 12:37
Игра "Новогодний хоровод" Phoenix77 Gamedev - cоздание игр: Unity, OpenGL, DirectX 7 02.02.2009 18:18
С днём студента! Greblin Свободное общение 5 26.01.2009 02:24
Мой новогодний компьютер meg33 Свободное общение 2 27.12.2007 16:16