Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
kravam
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
#1

Почему нельзя в конструкторе использовать параметр по умолчанию, если конструктор не встроен? - C++

17.12.2011, 08:15. Просмотров 914. Ответов 5
Метки нет (Все метки)

То есть честно говоря, вопрос так надо ставить: почему если конструктор встроенный, то можно использовать параметр (по умолчанию) шаблона класса, а если не встроеный, то нельзя? Если бы было единообразие, я бы может списал всё на стандарт, а так какой-то двойной стандарт получается!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 #include <stdio.h>
template <class T= int >
class kl {
 public:
  kl (T) {printf ("hello, word!\n");};
  //kl (T);
};
 
int main () {
 kl<> kl_ (45);
 getchar ();
 return 0;
}
 
//template <class T= int >
//kl <T>:: kl (T) {printf ("hello, word!\n");}
Вот если закомментить конструктор и ракомментить чё в даный момент закомменчено, то получится что конструктор объявлен в классе, а определён за его пределами. И тогда ничё компилиться не будет. Почему? (А щас компилится).
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.12.2011, 08:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему нельзя в конструкторе использовать параметр по умолчанию, если конструктор не встроен? (C++):

Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно? - C++
Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно?

Будет ли определен компилятором конструктор по умолчанию, если есть конструктор с дефолтным параметром? - C++
Добрый день, сразу к делу, есть некий класс class some { int x; public: some(int y = 1) : x(y) {} };

Почему break нельзя использовать в if? - C++
почему break нельзя использовать в if вот код if(f.eof()==1) { break; } про break MVS говорит что ОПЕРАТОР break...

Почему не работает следующий код из книги Страуструпа (конструктор значений по умолчанию) - C++
#include&lt;iostream&gt; using namespace std; class Date { int a, b; static Date default_date; public: Date(int x = 0, int...

Почему в списке инициализации конструктора дочернего класса нельзя вызывать конструктор родительского через его пространство имён? - C++
Есть класс D и от него порождён класс Wd Тут вот например всё работает корректно (использую обращение ч/з пространство имён класса &quot;D::&quot; ...

Почему нельзя использовать в операторе case переменные, которые определены как #define - C++
Я не понимаю, почему Visual Studio ругается на строку с case в коде. Вроде все правильно. Если там написать напрямую цифру, тогда все...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Card1nal
6 / 6 / 0
Регистрация: 04.01.2010
Сообщений: 118
17.12.2011, 08:22 #2
Темплейты вообще не желательно выносить за пределы класса. Поэтому для них и используют *.hpp Там частенько надо еще указывать все возможные варианты значения Т.
А вот почему - кроме как "так реализовали" я тебе ответить не могу. Надо просто помнить, что темплейты, по сут, другой язык, пристоенный к компилятору с++, и там свои заморочки.
yekka
385 / 149 / 8
Регистрация: 12.05.2011
Сообщений: 450
17.12.2011, 09:44 #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
template <class T= int >
class kl {
 public:
  kl (T);
};
 
int main () {
 kl<> kl_ (45);
 return 0;
}
 
template <class T >
kl <T>:: kl (T) {printf ("hello, word!\n");}
Дефолтные параметры указываются только один раз. Касается и обычных функций и шаблонов.
fasked
Эксперт С++
4934 / 2514 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
17.12.2011, 10:25 #4
Цитата Сообщение от Card1nal Посмотреть сообщение
Темплейты вообще не желательно выносить за пределы класса.
Это еще почему?
Card1nal
6 / 6 / 0
Регистрация: 04.01.2010
Сообщений: 118
17.12.2011, 14:44 #5
Цитата Сообщение от fasked Посмотреть сообщение
Это еще почему?
По причине читаемости. Их поэтому в hpp, как я уже сказал, и пишут. Одно дело когда код без темплейтов - да, там проще иметь прототипы в .h. А в темплейтах хотелось бы видить, что, собственно говоря меняется.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.12.2011, 14:51 #6
Цитата Сообщение от Card1nal Посмотреть сообщение
По причине читаемости.
нет, по причине "невозможности" импорта шаблонов в файл реализации

Цитата Сообщение от Card1nal Посмотреть сообщение
Их поэтому в hpp, как я уже сказал, и пишут. Одно дело когда код без темплейтов - да, там проще иметь прототипы в .h
Шаблоны можно писать в заголовчном файле. Заголовочный файл может иметь расширение как *.h так и *.hpp
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2011, 14:51
Привет! Вот еще темы с ответами:

Почему в выражении нельзя использовать запятую вместо && - C++
Привет всем, у меня такой вопрос: Почему в выражении for (i=0; i &lt; *k &amp;&amp; strcmp((base+i)-&gt;fam,fam); i++); вместо &quot;&amp;&amp;&quot;...

Создать класс. Написать конструктор по умолчанию, конструктор с параметрами. Перегрузить операции «меньше» и «равно» - C++
Помогите пожалуйста, хоть с одним из заданий. 1. Создать класс. Написать конструктор по умолчанию, конструктор с параметрами....

Ошибка: Нельзя инициализировать статические данные в конструкторе - C++
Ошибка: Нельзя инициализировать статические данные в конструкторе. //#include &lt;string.h&gt; #include &lt;stdio.h&gt; //#include &lt;conio.h&gt; ...

Почему нехорошо себя ведёт конструктор класса (не компилится ничё), если ему параметром ссылку на константу? - C++
То есть вообще непонятно ничё, вот, смотрите, этот пример не компилится: #include &lt;stdio.h&gt; class fee { public: //Не компилится ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
17.12.2011, 14:51
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru