Вопрос по шаблонам.
От: Croc Россия  
Дата: 11.10.04 13:04
Оценка:
Есть примерно такая конструкция в h-файле.

template <class T> class TMyTemplate
{
protected:
    T* m_pObject;
public:
    // some functions
    virtual void MyFunction() { some code is here;}
};

class CMyClass;

typedef TMyTemplate<CMyClass> CMyTemplateClass;


Теперь есть некаяя dll, которая создает объект pTest типа CMyTemplateClass, и передает его в приложение.
Приложение вызывает pTest->MyFunction().
По логике вещей, в этой ситуации вызов MyFunction должен быть виртуальным и "пойти" работать внутри DLL.
Собственно вопрос: какие-то пункты стандарта регламентируют соответствующее поведение, или оно остается на усмотрение авторов компилятора?
Re: Вопрос по шаблонам.
От: just_bear Россия  
Дата: 11.10.04 13:09
Оценка:
Здравствуйте, Croc, Вы писали:

Не понял вопрос. Виртуальная эта функция или нет, все равно код будет исполняться из того модуля, где этот класс реализован...
Re[2]: Вопрос по шаблонам.
От: just_bear Россия  
Дата: 11.10.04 13:12
Оценка:
_>Не понял вопрос. Виртуальная эта функция или нет, все равно код будет исполняться из того модуля, где этот класс реализован...

Виноват, не доглядел, что код метода встроен...
Тогда если в библиотеке есть явное инстаниирование шаблона, то будет вызван код из нее. Иначе код будет встроен в вызывающее приложение.
Re[3]: Вообще-то, вопрос был про стандарты
От: Аноним  
Дата: 11.10.04 13:16
Оценка:
Вообще-то, вопрос был про пункты стандарта.
Re: Вопрос по шаблонам.
От: Bell Россия  
Дата: 11.10.04 13:20
Оценка:
Здравствуйте, Croc, Вы писали:

C>Собственно вопрос: какие-то пункты стандарта регламентируют соответствующее поведение, или оно остается на усмотрение авторов компилятора?


DLL — это вещь сугубо платформенно-зависимая, а посему о них в стандарте языка не может быть и речи.
По существу: виртуальный вызов в твоем случае будет работать как положено. Если по каким-то причинам это не так, то было бы неплохо увидеть минимальный пример, иллюстрирующий проблему.
Любите книгу — источник знаний (с) М.Горький
Re[3]: И еще
От: Croc Россия  
Дата: 11.10.04 13:21
Оценка:
1. Поясняю, что технически код метода может иметь место в обоих модулях, и именно этот случай представляет интерес.

2. Еще раз напоминаю, что меня интересуют сугубо пункты стандарта, если он это регламентирует, нежели Ваше личное мнение (при всем моем уважении), просто потому, что у авторов компилятора может быть свое личное мнение, не совпадающее с мнением Вашим, и даже мнением большинства. Я именно так сформулировал свой вопрос.
Re[2]: Вопрос по шаблонам.
От: Croc Россия  
Дата: 11.10.04 13:30
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, Croc, Вы писали:


C>>Собственно вопрос: какие-то пункты стандарта регламентируют соответствующее поведение, или оно остается на усмотрение авторов компилятора?


B>DLL — это вещь сугубо платформенно-зависимая, а посему о них в стандарте языка не может быть и речи.

B>По существу: виртуальный вызов в твоем случае будет работать как положено. Если по каким-то причинам это не так, то было бы неплохо увидеть минимальный пример, иллюстрирующий проблему.

Спасибо, собственно проблемы пока нет. В рамках одного модуля реализация выглядит "правильной": адрес вызова для этой функции берется из vfptr объекта.

Просто мой коллега хотел более веских аргументов (например, пунктов стандарта), которые бы это гарантировали, прежде чем внедрять такой шаблон в проект. В частности, имеют место вопросы (и у меня в том числе) "а будет ли это работать на других компиляторах?".
Re[3]: Вопрос по шаблонам.
От: Bell Россия  
Дата: 11.10.04 13:46
Оценка:
Здравствуйте, Croc, Вы писали:

C>Просто мой коллега хотел более веских аргументов (например, пунктов стандарта), которые бы это гарантировали, прежде чем внедрять такой шаблон в проект. В частности, имеют место вопросы (и у меня в том числе) "а будет ли это работать на других компиляторах?".


Шаблоны тут совершенно не при чем — механизм реализации виртуальных вызовов одинаков для шаблонов и для обычных классов. Однако этот механизм вполне может быть реализован по-разному на разных компиляторах, поскольку все это — implementation defined. Так что исполняемый модуль и dll, собранные разными компиляторами, вполне могут отказаться работать вместе.
Любите книгу — источник знаний (с) М.Горький
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.