powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Шаблоны в MinGW
6 сообщений из 6, страница 1 из 1
Шаблоны в MinGW
    #35017637
Фотография selinoth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!

Занимаюсь переводом весьма крупного проекта с win32 на linux. Решил попробовать собрать под MinGW, пока серв с линухом не готов... не копмилируется простейший шаблон с внешними методами!
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
template <class T>
class allocator
{
public:
	 typedef size_t		size_type;
	 typedef ptrdiff_t	difference_type;
	 typedef T*			pointer;
	 typedef const T*	const_pointer;
	 typedef T&			reference;
	 typedef const T&	const_reference;
	 typedef T			value_type;
	 template <class U> struct rebind { typedef allocator<U> other; };
	 allocator() throw();
#if !defined( _MSC_VER ) // Microsoft C++ compiler does not support this.
	 allocator(const allocator&) throw();
#endif
	 template <class U> allocator(const allocator<U>&) throw();
	~allocator() throw();
	 pointer address(reference x) const;
	 const_pointer address(const_reference x) const;
	 pointer allocate(
		 size_type n, allocator<void>::const_pointer hint =  0 );
	 void deallocate(pointer p, size_type n);
	 size_type max_size() const throw();
	 void construct(pointer p, const T& val);
	 void destroy(pointer p);
}; // allocator<T>

Сыпется вот здесь и в аналогичных объявлениях:
Код: plaintext
1.
2.
3.
4.
template <class T> allocator<T>::pointer allocator<T>::address(reference x) const
{
	return &x;
}

Говорит, что у меня хрень написана перед 'allocator' (ожидается тип и т.п.). Если я код методов вставляю непосредственно в класс, то сжирает. Собственно вопрос: в g++ нельзя выносить методы шаблонов классов за пределы этих самих шаблонов?
...
Рейтинг: 0 / 0
Шаблоны в MinGW
    #35017751
а так?

Код: plaintext
1.
2.
3.
4.
template <class T> typename allocator<T>::pointer allocator<T>::address(reference x) const
{
	return &x;
}
...
Рейтинг: 0 / 0
Шаблоны в MinGW
    #35018066
Фотография selinoth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помогло! спасибо.
...
Рейтинг: 0 / 0
Шаблоны в MinGW
    #35019107
Фотография selinoth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще кое-что, чего я не могу понять:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
template <class T>
class A
{
protected:
    T m_value;

}; // A

template <class T>
class B: public A<T>
{
public:
    T& Reference (void);

}; // B

template <class T> T& B<T>::Reference (void)
{
    return m_value;
}

int main (void)
{
    B<int> b;

    b. Reference() =  70846 ;

    return  0 ;
}

На это g++ выдает мне следующее:

Код: plaintext
1.
2.
test0.cpp: In member function `T& B<T>::Reference()':
test0.cpp:21: error: `m_value' was not declared in this scope

Если я указываю явно A<T>::m_value, то сжирает. Практически та же херня с наследуемыми функциями (он их считает глобальными, но не объявленными). При явном указании, откуда что берется - все ок. Но ведь это ацки тупо каждый раз указывать область видимости! Есть ли разумное решение этой проблемы в g++?

Заранее благодарен.
...
Рейтинг: 0 / 0
Шаблоны в MinGW
    #35019175
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
selinoth
Код: plaintext
1.
2.
3.
4.
5.
6.
. . .
template <class T> T& B<T>::Reference (void)
{
    return m_value;
}
. . .

На это g++ выдает мне следующее:

Код: plaintext
1.
2.
test0.cpp: In member function `T& B<T>::Reference()':
test0.cpp:21: error: `m_value' was not declared in this scope
и правильно делает, в этом выражении обращение к m_value не зависит от параметра шаблона и должно быть "привязано" сдесь, а не в момент инстанцирования шаблона.

selinothЕсли я указываю явно A<T>::m_value, то сжирает. Практически та же херня с наследуемыми функциями (он их считает глобальными, но не объявленными). При явном указании, откуда что берется - все ок. Но ведь это ацки тупо каждый раз указывать область видимости!можно ещё указывать
return this->m_value;
return B<T>::m_value;
class ... { using A<T>::m_value; ... { return m_value; } };
тоесть любым способом сделать обращение к m_value зависимым от параметра шаблона.
ISO/IEC 14882:2003(E) Programming languages — C++ смотри главу 14.6.2 Dependent names selinothЕсть ли разумное решение этой проблемы в g++?угу, НЕ использовать язык С++... :) вообще есть ключик:
Код: plaintext
1.
2.
3.
       -fpermissive
           Downgrade some diagnostics about nonconformant code from errors to warnings.  Thus, using -fpermissive will
           allow some nonconforming code to compile.
но он, насколько я понял, максимум - поможет закрыть глаза на вызовы функций из базового класса-шаблона.

вот ещё ссылки по теме:
10.8 Common Misunderstandings with GNU C++ раздел "Name lookup"

http://gcc.gnu.org/bugs.html]раздел "Non-bugs" в самом конце - New in GCC 3.4.0 - ...This also affects members of base classes, see [14.6.2]...
...
Рейтинг: 0 / 0
Шаблоны в MinGW
    #35019671
Фотография selinoth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем большое спасибо за информацию!
Очевидно, что предстоит масса ручной работы с кодом...
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Шаблоны в MinGW
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]