Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Параметры метода, зависящие от шаблона 
V
    Опции темы
ANTON_AL
Дата 17.9.2007, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 292
Регистрация: 27.1.2007

Репутация: нет
Всего: нет



Доброго дня.

Вот такая ситуация:

В приведённом коде класс A, принимает в качестве шаблонного параметра нечто, у чего есть член Count

Код

#include <conio.h>
#include <iostream>
using namespace std;




template< class T >
class A
{
    public:
        void SomeMethod( int *pFrames[T::Count] );
};




template< class T >
void A<T>::SomeMethod( int *pFrames[T::Count] )
{

}  //Here i cause an error




void main( )
{
    

    getch( );
}




В результате компиляции получаю ошибку error C2244: 'A<T>::SomeMethod' : unable to match function definition to an existing declaration.

У меня есть предположение, что происходит конфликт между объявлением шаблона  и тем шаблонным параметром, который явно передаётся в A< > в месте, где описана реализация метода. Но как это обойти?? И в этом ли причина??

Это сообщение отредактировал(а) ANTON_AL - 17.9.2007, 16:45
PM MAIL   Вверх
Fazil6
Дата 17.9.2007, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



глянь в MSDN описание этой ошибки.
Решается просто
Код

#include <conio.h>
#include <iostream>
using namespace std;




template< class T >
class A
{
    public:
        void SomeMethod( int *pFrames[T::Count] )
         {}
};






void main( )
{
    

    getch( );
}

PM MAIL   Вверх
MAKCim
Дата 17.9.2007, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



ANTON_AL, 
какой компилятор?
GCC 4.1.2 компилирует нормально


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Fazil6
Дата 17.9.2007, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



кстати помоему ты чего-то нето тут придумал
Код

int *pFrames[T::Count]

PM MAIL   Вверх
ANTON_AL
Дата 17.9.2007, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 292
Регистрация: 27.1.2007

Репутация: нет
Всего: нет



MAKCim
    Я под VisualStudio.


Fazil6, 
   кстати помоему ты чего-то нето тут придумал
Это необходимость. На вход нужно ожидать массив только такого размера, как в T::Count
PM MAIL   Вверх
Fazil6
Дата 17.9.2007, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(ANTON_AL @  17.9.2007,  17:08 Найти цитируемый пост)
Это необходимость. На вход нужно ожидать массив только такого размера, как в T::Count

ну если тока Count объявлен как static
PM MAIL   Вверх
MAKCim
Дата 17.9.2007, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Fazil6, 
или enum  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Earnest
Дата 17.9.2007, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Судя по объявлению T::Count он только и может быть enum или static...
Хотя... еще, конечно может быть типом или методом... smile 

Только вот насчет необходимости... Что-то я сомневаюсь, что таким образом ты пресечешь попытку вызвать SomeMethod с адресом массива, где два элемента. Или 5. В общем, любым. Это все же С, не забывай. В гробу он видал размеры встроенных массивов.
Тогда уж объяви встроенный тип typedef int*[T::Count] CFrames; 
Да и то, не уверена, что поможет.
В любом случае, как-то это дурно пахнет.



--------------------
...
PM   Вверх
ANTON_AL
Дата 17.9.2007, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 292
Регистрация: 27.1.2007

Репутация: нет
Всего: нет



Earnest, 
   как-то это дурно пахнет.

Эх. . .Пахло бы очень хорошо, если б я мог пресечь ( раньше почему то  думал, что мог ).

Ну тогда от этой затеи придётся отказаться, а сделать просто **ppArray.

Странно, а какой вообще тогда смысл в таких параметрах . . .
Код

void func1( int *pArray[6] ){ }

. . .если они не на что не влияют.

Это, получается эквивалентно такому
Код

void func1( int **ppArray ){ }



Но всёравно от первого метода есть польза: раз уж он что то и не пресекает, зато он обеспечивает наглядность в коде, и, хотелось бы всётаки как-то оставить такое объявление. Придётся поломать голову. . .

Fazil6
   Решается просто
Да, но, боюсь представить себе границы объявления класса  smile 

 smile 
Earnest, Ты, оказывается, женщина . . . Уже второе моё заблуждение за сегодня. smile 

Это сообщение отредактировал(а) ANTON_AL - 17.9.2007, 18:42
PM MAIL   Вверх
ANTON_AL
Дата 17.9.2007, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 292
Регистрация: 27.1.2007

Репутация: нет
Всего: нет



Так просто оказалось:
Код



template< class T >
class A
{
    static const int Count = T::Count;


    public:
        void Method1( int *pArray[Count] );
};





template< class T >
void A<T>::Method1( int *pArray[Count] )
{

}

PM MAIL   Вверх
Skladnoy
Дата 17.9.2007, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 13.9.2007

Репутация: нет
Всего: нет



Цитата(ANTON_AL @  17.9.2007,  18:35 Найти цитируемый пост)

Странно, а какой вообще тогда смысл в таких параметрах . . .
Код

void func1( int *pArray[6] ){ }

. . .если они не на что не влияют.

Это указание программисту, что функция ожидает массив именно такой длины. Компилятор, правда, проглотит все подряд
PM MAIL   Вверх
Fazil6
Дата 17.9.2007, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(Skladnoy @  17.9.2007,  21:40 Найти цитируемый пост)
Компилятор, правда, проглотит все подряд

делайте как ссылку на массив и ничего компиллятор глотать не будет.
Код

void func1( int *(&pArray)[6] ){ }

PM MAIL   Вверх
Skladnoy
Дата 18.9.2007, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 13.9.2007

Репутация: нет
Всего: нет



Цитата(Fazil6 @  17.9.2007,  21:57 Найти цитируемый пост)
делайте как ссылку на массив и ничего компиллятор глотать не будет.

1. Если надо передать именно указатель - надо делать страшный каст. 
2. В С нет ссылок (только в С++)
PM MAIL   Вверх
zkv
Дата 18.9.2007, 01:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(Skladnoy @  18.9.2007,  00:47 Найти цитируемый пост)
В С нет ссылок (только в С++) 

а шаблоны есть?  smile 
Это я к названию темы, если что...
PM MAIL   Вверх
Earnest
Дата 18.9.2007, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Мне кажется, тут не стоит быть святее папы римского. В C++ при желании можно обойти любые ограничения. Главное - явно обозначить намерения. Сделать это можно хоть таким кодом (с явным указанием размера), хоть комментарием... я бы ограничилась комментарием. А в функции устроить дополнительную проверку - что память по переданному указателю не меньше предполагаемой.


--------------------
...
PM   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0641 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.