Эй, у меня есть довольно простой вопрос, который не могут решить некоторые быстрые поиски в 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();
};
};
}
как называются эти функции?
Есть ли какая-то формула, которой я могу следовать, когда дело доходит до этого, или она более гибкая, иная для ваших нужд?
Спасибо за помощь!
Я использую визуальные студии, если это что-то меняет …
Дано:
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 }
Чтобы использовать класс в вашем файле реализации (.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
}