Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2012, 23:39   #1
prc
 
Регистрация: 24.03.2011
Сообщений: 6
По умолчанию шаблон массива с указателем в качестве параметра

Не пойму, в чем просчет. Может кто укажет на мою ошибку?

Код:
#include <iostream>
#include <cstdlib>
template <class T, int *pd>
class ArrayTP
{
private:
     T ar[*pd];
public:
    ArrayTP() {};
    explicit ArrayTP(const T & v);
    virtual T & operator[](int i);
    virtual T operator[](int i) const;
};
int x = 7;
template <class T, int *pd>
ArrayTP<T,pd>::ArrayTP(const T & v)
{
    for (int i = 0; i < *pd; i++)
        ar[i] = v;
}

template <class T, int *pd>
T & ArrayTP<T, pd>::operator[](int i)
{
    if (i < 0 || i >= *pd)
    {
        std::cerr << "Error in array limits: " << i
            << " is out of range\n";
        std::exit(EXIT_FAILURE);
    }
    return ar[i];
}

template <class T, int *pd>
T ArrayTP<T, pd>::operator[](int i) const
{
    if (i < 0 || i >= *pd)
    {
        std::cerr << "Error in array limits: " << i
            << " is out of range\n";
        std::exit(EXIT_FAILURE);
    }
    return ar[i]; 
}

int main()
{	
	ArrayTP<double, &x> obj(777.7);
	int i = 0;
	for( i = 0; i < 7; i++)
		std::cout << obj[i] << ' ' << std::endl;
	return 0;
}
Компилятор выдает:
arraytp.cpp(11): error C2057: требуется константное выражение
prc вне форума Ответить с цитированием
Старый 30.01.2012, 00:31   #2
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Размерность массива должна быть константой. Об этом и говорит компилятор
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 30.01.2012, 00:40   #3
prc
 
Регистрация: 24.03.2011
Сообщений: 6
По умолчанию

Но адрес любого объекта в области видимости пространства имен , в отличие от адреса локального объекта , является константным выражением ( даже если спецификатор const отсутствует ), поэтому его можно применять в качестве аргумента для параметра, что у меня и сделано в строке: int x = 7, следовательно, я передаю в шаблон константное выражение (&x), равное 7.
prc вне форума Ответить с цитированием
Старый 30.01.2012, 02:16   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от prc Посмотреть сообщение
я передаю в шаблон константное выражение (&x), равное 7.
Нет. Ты передаешь в шаблон адрес не_константной переменной.
&x - это адрес. И он не будет равен 7

А внутри шаблона:

Код:
private:
     T ar[*pd]; //извлекаешь значение не_константной переменной.
Количеством элементов массива не может быть значение не_константной переменной.
_Bers вне форума Ответить с цитированием
Старый 30.01.2012, 10:13   #5
prc
 
Регистрация: 24.03.2011
Сообщений: 6
По умолчанию

Спасибо, _Bers
prc вне форума Ответить с цитированием
Старый 30.01.2012, 13:45   #6
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

prc

адрес любого объекта в области видимости пространства имен , в отличие от адреса локального объекта , является константным выражением ( даже если спецификатор const отсутствует ), поэтому его можно применять в качестве аргумента для параметра, что у меня и сделано

это все конечно замечательно, но в параметре шаблона требуется константа времени компиляции.
Rififi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Интерфейс в качестве параметра sVasilich Общие вопросы C/C++ 8 13.01.2012 15:36
Двумерный массив в качестве параметра _-Re@l-_ Паскаль, Turbo Pascal, PascalABC.NET 15 06.07.2010 22:59
Массив в качестве параметра DeKot Общие вопросы Delphi 6 15.10.2009 22:32
Функции. Передача массива в качестве параметра функции. Wia Помощь студентам 2 17.03.2009 14:57