LINUX.ORG.RU

использование using и возвращаемые типы

 


0

1

Есть 2 класса: B.h:

#pragma once

class B
{
public:
	B();
	virtual ~B();
};
и A.h, в котором класс B используется как поле.
#pragma once

#include "B.h"

class A
{
public:
	using bns = B; // И вот если мы обявим его через using, то начинаются чудеса
private:
	bns* m_Bclass;
public:
	A();
	virtual ~A();

	bns* get_b();
	void set_b(bns* b);
};
И собственно A.cpp
#include "A.h"

A::A()
{
	m_Bclass = nullptr;
}

A::~A()
{
}

void A::set_b(bns* b) // тут всё нормально
{
	m_Bclass = b;
}

bns* A::get_b() // а тут error: ‘bns’ does not name a type
{
	return m_Bclass;
}
Я понимаю, что чего-то не понимаю. Почему публично обявленный через using тип можно принимать, но нельзя возвращать?

★★★★★

Последнее исправление: eagleivg (всего исправлений: 1)

A::bns

или auto A::get_b() -> bns

anonymous
()

Я понимаю, что чего-то не понимаю. Почему публично обявленный через using тип можно принимать, но нельзя возвращать?

Потому что potential scope для имён, объявленных в классе, продолжается за определение класса с определёнными ограничениями. Например, для определений методов класса вне класса potential scope начинается за идентификатором («именем») метода, но не перед ним.

The potential scope of a declaration that extends to or past the end of a class definition also extends to the regions defined by its member definitions, even if the members are defined lexically outside the class (this includes static data member definitions, nested class definitions, and member function definitions, including the member function body and any portion of the declarator part of such definitions which follows the declarator-id, including a parameter-declaration-clause and any default arguments).

https://timsong-cpp.github.io/cppwp/n3337/basic.scope#class-1.5
https://timsong-cpp.github.io/cppwp/n4140/basic.scope#class-1.5
https://timsong-cpp.github.io/cppwp/n4659/basic.scope#class-4

utf8nowhere ★★★
()
Последнее исправление: utf8nowhere (всего исправлений: 1)
Ответ на: комментарий от xaizek

Может не подходить по этическим причинам, например.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.