Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Проблема с параметром по умолчанию.


Автор: SaDFromSpb 31.5.2006, 16:27
Текст хидера:
Код
#include <iostream>

template<class Tostream = std::ostream> 
class Value
{ 
public:
  
  Value(Tostream& _out = std::cout);
  
  void print(int i);
  
private:
  Tostream& out;
};

Текст сишника:
Код
#include "main.hpp"


template<class Tostream>
Value<Tostream> :: Value(Tostream& _out) : out(_out) {};

template<class Tostream>
void Value<Tostream> :: print(int i) {
  out << i << std::endl;
};

int main(int argc, char* argv[])
{

  Value<> val(std::cout);
  val.print(34);

  return 0;
} 

Если в 15 строке убрать параметр для конструктора, то выпрыгивает ошибка в строке 16:
Цитата
error: request for member `print' in `val', which is of
   non-aggregate type `Value<std::basic_ostream<char, std::char_traits<char> >
   > ()()'

А его использовать так хочется! 

Автор: DeadSoul 31.5.2006, 16:35
Код

Value<std::cout> val;


Шаблон совсем без параметров не бывает. 

Автор: bsa 31.5.2006, 16:35
Судя по всему, компилятору не удается определить тип шаблона класса, если ты используешь параметр конструктора по-умолчанию. 

Автор: MAKCim 31.5.2006, 16:49
Цитата

Value<std::cout> val;

Это не правильно
в шаблонах нельзя использовать параметры типа "объект класса"
SaDFromSpb
какой компилятор?
у меня все компилится (g++ 4.0.2)

Добавлено @ 16:52 
Цитата

Судя по всему, компилятору не удается определить тип шаблона класса, если ты используешь параметр конструктора по-умолчанию.  

а тут нечего определять
раз <> значит Tostream = std::ostream, аргумент конструктора этому соответсвует 

Автор: bsa 31.5.2006, 16:54
Это тебе нечего определять. А компилятор не такой умный.  smile  

Автор: SaDFromSpb 31.5.2006, 17:04
DeadSoul, но ведь работает же...  Я, кстати, пробовал несколько параметров для шаблона делать. Не помогает.

MAKCim,
компилятор g++ (GCC) 3.3.3 20040412 (Red Hat Linux 3.3.3-7).

bsa, тебе же говорят, что компилится.

Глюк компилятора чтоли... 

Автор: MAKCim 31.5.2006, 17:04
Цитата

А компилятор не такой умный.

его проблемы  smile 
а вообще не вижу я разницы между
Код

Value<std::ostream> a;

и
Код

Value<> a;

да и Comeau согласен тоже (хотя он шибко умный...  smile )
 

Автор: SaDFromSpb 31.5.2006, 17:13
Блин! Я понял, что я ламмер!!!  smile 
Я когда убирал параметр я сами скобочки оставил!  smile
Бывают же ляпы...
Всем ссори за беспокойство 

Автор: Earnest 1.6.2006, 17:31
Именно, а
Код

Value<> val();

это объявление функции val, которая возвращает Value<std::ostream>...
Отсюда и последующая ругань компилятора.
Есть такая милая фича у C++... 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)