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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.05.2016, 20:28   #1
OktXIV
Пользователь
 
Регистрация: 16.02.2013
Сообщений: 18
По умолчанию Чем мешает namespace?

Код:
#include <iostream>
#include <type_traits>

using namespace std;

namespace _NS
{
	template <class T>
	class BaseA
	{
		template <class T, class E> friend class A;

		template <class T>
		class B
		{
			template <class T, class E> friend class A;
			static void B_priv_func()
			{
				cout << "Hello world!" << endl;
			}
		};

		class C : public B<T> {};
	};
}

template <class T, class E = void> class A;
template <class T> class A<T, typename std::enable_if<std::is_class<T>::value>::type> final :
	_NS::BaseA<T>::C
{
public:
	static void test_func()
	{
		C::B::B_priv_func();
	}
};

struct MyClass {};

int main()
{
	A<MyClass>::test_func();
	cin.get();
}
компилятор выдает:
Ошибка C2248 _NS::BaseA<T>::C: невозможно обратиться к private class, объявленному в классе "_NS::BaseA<T>"

Но если убрать namespace:

Код:
#include <iostream>
#include <type_traits>

using namespace std;

template <class T>
class BaseA
{
	template <class T, class E> friend class A;

	template <class T>
	class B
	{
		template <class T, class E> friend class A;
		static void B_priv_func()
		{
			cout << "Hello world!" << endl;
		}
	};

	class C : public B<T> {};
};

template <class T, class E = void> class A;
template <class T> class A<T, typename std::enable_if<std::is_class<T>::value>::type> final :
	BaseA<T>::C
{
public:
	static void test_func()
	{
		C::B::B_priv_func();
	}
};

struct MyClass {};

int main()
{
	A<MyClass>::test_func();
	cin.get();
}
Компилируется без ошибок.

Объясните в чем дело.
OktXIV вне форума Ответить с цитированием
Старый 14.05.2016, 00:02   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от OktXIV Посмотреть сообщение

Компилируется без ошибок.

Объясните в чем дело.
компилируется с ошибками.



Цитата:
Error(s):
source_file.cpp:9:12: error: declaration of ‘class T’
template <class T, class E> friend class A;
^
source_file.cpp:6:11: error: shadows template parm ‘class T’
template <class T>
^
source_file.cpp:11:12: error: declaration of ‘class T’
template <class T>
^
source_file.cpp:6:11: error: shadows template parm ‘class T’
template <class T>
^
source_file.cpp:14:13: error: declaration of ‘class T’
template <class T, class E> friend class A;
^
source_file.cpp:11:12: error: shadows template parm ‘class T’
template <class T>
^
source_file.cpp: In static member function ‘static void A<T, typename std::enable_if<std::is_class<_Tp>:: value>::type>::test_func()’:
source_file.cpp:31:3: error: ‘C’ has not been declared
C::B::B_priv_func();
^
source_file.cpp: In instantiation of ‘class A<MyClass>’:
source_file.cpp:39:12: required from here
source_file.cpp:21:8: error: ‘class BaseA<MyClass>::C’ is private
class C : public B<T> {};
^
source_file.cpp:25:26: error: within this context
template <class T> class A<T, typename std::enable_if<std::is_class<T>::va lue>::type> final :
^
возможно у вас вижуал студия.
она жрет и то, что не по стандарту.

однако, если что-то не по стандарту - вам уже никто ничего не гарантирует.

Последний раз редактировалось _Bers; 14.05.2016 в 00:04.
_Bers вне форума Ответить с цитированием
Старый 14.05.2016, 10:19   #3
OktXIV
Пользователь
 
Регистрация: 16.02.2013
Сообщений: 18
По умолчанию

У меня Visual Studio 2015 Express.

Что именно не по стандарту? ( и какому стандарту: С++11/14 ?)

Я скачал стандарт, прочитаю (если осилю), но готовый ответ будет быстрее)

Скачал вот такой стандарт:
Document Number: N3797
Date: 2013-10-13
Revises: N3691

Не знаю насколько он актуален.

Если Visual Studio не по стандарту, что посоветуете взамен.
OktXIV вне форума Ответить с цитированием
Старый 14.05.2016, 10:24   #4
OktXIV
Пользователь
 
Регистрация: 16.02.2013
Сообщений: 18
По умолчанию

Нашел стандарт посвежее:
http://www.open-std.org/jtc1/sc22/wg...2016/n4582.pdf
OktXIV вне форума Ответить с цитированием
Старый 14.05.2016, 11:44   #5
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
она жрет и то, что не по стандарту.
На последней С++ Russia выступал Карпов (который PVS Studio крутит) с интересным докладом. В том числе по стандарту рассказывал - как я понял, в gcc гораздо больше всяких нестандартных фичей, чем в студии.

Но лично мое мнение - вылазят они реже. Ну типа как там Карпов рассказывал про что-то типа своих собственных лямбд в gcc (если не путаю), как бэ, если хочешь чтобы код переносимым был - просто можешь не юзать эти фичи. Ну а в студии все постоянно наружу лезет.
rrrFer вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что мешает циклу for ? Dfence11 Общие вопросы C/C++ 4 10.03.2013 17:25
error CS0234: The type or namespace name 'error_messages' does not exist in the namespace 'iTextSharp.text' jei_ C# (си шарп) 0 03.12.2012 11:45
нужен ip, но мешает роутер maloun Работа с сетью в Delphi 5 15.03.2012 18:19
использование конструкции "using <namespace>::<namespace-member>" happy_horror Общие вопросы C/C++ 5 08.03.2009 15:30