информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Все любят медЗа кого нас держат?
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Microsoft Authenticator прекращает... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
[C++] template 30.03.03 06:24  Число просмотров: 1106
Автор: dl <Dmitry Leonov>
<"чистая" ссылка>
> ПОЧЕМУ? Почему не работает, как предполагалось?
> P.S. Компилятор из VS6.0

Скорее всего, это просто ошибка компилятора, при выборе реализации шаблона происходит некорректное преобразование типа и берется первая частная спецификация, удовлетворяющая этому преобразованию (преобразование char к int еще можно было бы простить, но не наоборот, и уж точно не double к char). В утешение могу сказать, что компилятор от VS.NET 2003 генерит код, выводящий, как и положено, 542.
<programming>
[C++] template 29.03.03 23:58  
Автор: Green Статус: Незарегистрированный пользователь
Отредактировано 30.03.03 00:04  Количество правок: 2
<"чистая" ссылка>
Есть такой код:

#include <iostream>
using namespace std;

template <class T>
void get() {
cout << 2;
}

template<>
void get<char>() {
cout << 5;
}

template<>
void get<int>() {
cout << 4;
}

int main() {
get<char>();
get<int>();
get<double>();

return 0;
}

Предполагалось, что на экран выведется:
5
4
2
Но в реальности выводиться:
5
5
5
При этом, если поменять местами частные спецификации для char и int, т.е. записать:

template <class T>
void get() {
cout << 2;
}

template<> // местоположение
void get<int>() { // в коде изменено
cout << 4; //
}

template<> // местоположение
void get<char>() { // в коде изменено
cout << 5; //
}

int main() {
get<char>();
get<int>();
get<double>();

return 0;
}

то будет выводиться уже:
4
4
4

ПОЧЕМУ? Почему не работает, как предполагалось?

P.S. Компилятор из VS6.0
[C++] template 30.03.03 06:24  
Автор: dl <Dmitry Leonov>
<"чистая" ссылка>
> ПОЧЕМУ? Почему не работает, как предполагалось?
> P.S. Компилятор из VS6.0

Скорее всего, это просто ошибка компилятора, при выборе реализации шаблона происходит некорректное преобразование типа и берется первая частная спецификация, удовлетворяющая этому преобразованию (преобразование char к int еще можно было бы простить, но не наоборот, и уж точно не double к char). В утешение могу сказать, что компилятор от VS.NET 2003 генерит код, выводящий, как и положено, 542.
[C++] template 30.03.03 13:18  
Автор: Green Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> > ПОЧЕМУ? Почему не работает, как предполагалось?
> > P.S. Компилятор из VS6.0
>
> Скорее всего, это просто ошибка компилятора, при выборе
> реализации шаблона происходит некорректное преобразование
> типа и берется первая частная спецификация, удовлетворяющая
> этому преобразованию (преобразование char к int еще можно
> было бы простить, но не наоборот, и уж точно не double к
> char). В утешение могу сказать, что компилятор от VS.NET
> 2003 генерит код, выводящий, как и положено, 542.

Спасибо, утешил.
Перехожу на VS.NET.
Кстати, он поддерживает и инстанирование шаблона шаблоном.
Но вот не до сих пор поддерживает частичную спецификацию шаблона. :о(
[C++] template 30.03.03 17:14  
Автор: dl <Dmitry Leonov>
<"чистая" ссылка>
> Спасибо, утешил.
> Перехожу на VS.NET.
> Кстати, он поддерживает и инстанирование шаблона шаблоном.
> Но вот не до сих пор поддерживает частичную спецификацию
> шаблона. :о(

бета 2003 уже поддерживает.

In the Visual C++ .NET 2003 release, the conformance of the Visual C++ compiler was significantly improved in the following areas:

Defining Member Templates Outside a Class
Compiler Correctly Disambiguates Complex Expressions or Types
Default Initialization of Scalar Types
Templated User Defined Conversions
Universal Character Names
Operator that is Pointer to Function
Support Aggregate Initialization
References Supported as Nontype Template Parameters
Argument Dependent Name (AKA Koenig) Lookup on Functions
Partial Ordering of Function Templates
Partial Specialization of Class Templates
Unicode Support
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach