Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > библиотека шаблонов |
Автор: Andrej23 28.10.2010, 16:31 | ||||||
Доброго времени суток. Собственно такая вот загвоздка вышла: Пытаюсь сделать шаблон. Шаблон сам нормально компилируется, но при его вызове vs2005 выдает ошибку: error C2597: illegal reference to non-static member 'Indicators::Regr' Шаблон объявил так:
Вызываю его так:
компилятор на вызов шаблона ругается т.к. Indicators::Regr - это массив из 20 элементов double, хотя и даю адрес конкретной ячейки массива (типа double). собственно при вызове используются массивы с элементами типа класс. Сама структура:
Как правильно изменить объявление ф-ии чтобы можно было задавать параметром элемент массива (чтобы можно было сказать &Indicators::Regr[0] )? |
Автор: Andrej23 28.10.2010, 17:10 | ||
В принципе вызвал шаблон, считающий значение Indicators::Regr[0] прямо из шаблона StdDevRegTempl , но остался общий вопрос - как можно сделать вызов значения напрямую, без промежуточного расчета чтобы сделать шаблон StdDevRegTempl еще более общим. Попробовал сделать кол-во элементов массива константой, не помогло:
Всё равно пишет, что illegal reference to non-static member 'Indicators::Regr' |
Автор: rudvil 28.10.2010, 20:44 | ||
Компилятор же пишет, что "так" использовать не-статические члены класса нельзя, соответственно нужно объявить их статическими.
|
Автор: Andrej23 29.10.2010, 15:21 |
У меня массив Instr.i[] с объектами этого класса. Если сделать члены класса статическими, то получится по одному экземпляру массива-члена класса на весь массив объектов этого класса. Похоже пока что просто оставлю расчет с вызовом шаблона изнутри другого шаблона. Работает медленнее, но работает. А как перейду на с++, тогда по-другому попробую (несколько веток назад подсказали 2 варианта, возможно во втором варианте такой фокус пройдет). |
Автор: Master01 29.10.2010, 19:15 | ||
Очень маловероятно, что такой код вообще будет работать, поскольку все параметры шаблона должны быть известны в момент компиляции! А тут у вас передаётся адрес поля &Tick::Price и &Indicators::Regr[0] которые на этапе компиляции никак известны быть не могут. |
Автор: Master01 1.11.2010, 22:54 | ||||||
угу, признаю был не прав. Я просто вообще не в курсе был про ссылки на члены-данные класса .... Я тут почитал Страуструпа ![]()
равносильно
Так что можно, например, написать какой-то темплейт который будет автоматом разворачиваться в нечто подобное, а потом брать ссылку на этот самый addr и кастить через reinterpret_cast .... да простят меня великии за такое ![]() Но это ужасно! и так делать не надо ![]() Вообщем, я бы предложил вам лучше передавать ссылки не на сами членны-данные класса, а на некоторый метод класса, который их возвращает? Гибкость таже (и даже больше, так как метод может предварительно эти данные обработать ещё), но с другой стороны, придётся писать такие методы конечно... Вот код, для примера (немного переработанный оригинальный код djamshud-а, взятый по той линке, что вы мне дали)
Спасибо за инфу про ссылки на члены-данные класса ![]() |