Как написать заголовок функции оператора разрешения области для вложенных классов?

Эй, у меня есть довольно простой вопрос, который не могут решить некоторые быстрые поиски в Google, поэтому я приду сюда за помощью.

У меня проблемы с тем, чтобы просто выполнить свое задание, потому что я даже не могу написать скелетный код!

В основном у меня есть заголовочный файл, например, так:

namespace foo{
class A {
public:
class B {
B();
int size();
const int last();
};
};
}

И я хочу знать, как обращаться к этим парням вне файла в файле реализации.

БОНУС:

namespace foo{

template<typename T>
typename
class A {
public:
class B {
B();
int size();
const int last();
};
};
}

как называются эти функции?

Есть ли какая-то формула, которой я могу следовать, когда дело доходит до этого, или она более гибкая, иная для ваших нужд?

Спасибо за помощь!

Я использую визуальные студии, если это что-то меняет …

-1

Решение

Дано:

namespace foo{
class A {
public:
class B {
B();
int size();
const int last();
};
};
}

Полное имя для определения функции size или last будет:

int foo::A::B::size() {...}
const int foo::A::B::last() {...}

Дано:

namespace foo{

template<typename T>
typename
class A {
public:
class B {
B();
B & operator ++();
int size();
const int last();

template< typename I, typename R>
R getsomethingfrom( const I & );
};
};
}

Определения функций будут такими:

template <typename T> int foo::A<T>::B::size() { ... }
template <typename T> const int foo::A<T>::B::last() { ... }

Для этого получение указателя на функцию-член будет:

auto p = &foo::A<T>::B::size;

Определение конструктора будет:

template<typename T> foo::A<T>::B::B() {}

Делая одну из этих вещей:

foo::A<T>::B nb{}; // note, with nb() it complains

Определение операторной функции, возвращающей ссылку на B в шаблоне, хитрый:

template<typename T>         // standard opening template....
typename foo::A<T>::B &        // the return type...needs a typename
foo::A<T>::B::operator++()     // the function declaration of operation ++
{ ... return *this; }        // must return *this or equivalent B&

Если вам интересно, если функция шаблона находится внутри B, например, получает что-то от, то определение функции:

template< typename T>                       // class template
template< typename I, typename R>           // function template
R foo::A<T>::B::getsomethingfrom( const I & ) // returns an R, takes I
{ R r{}; return r }
4

Другие решения

Чтобы использовать класс в вашем файле реализации (.cpp), вам нужно:

namespace foo{
A::B::B(){
// this is your inner class's constructor implementation
}

int A::B::size(){
// implementation for you size()
int res = last(); // access the method last() of the same object
return res;
}

const int A::B::last(){
// implementation of last()
return 42;
}

}

void main(){
foo::A a; // construct an object of A
// can't do anything useful as the methods of A::B are all private
}
0

По вопросам рекламы [email protected]