2016-10-13 5 views
2

У меня есть код, как это:Как вы определяете реализацию функции вложенного класса вне функции?

class A { 
    void foo() { 
    class B { 
     void bar() { std::cout << "Bar!" << endl; } 
    }; 
    B b; 
    } 
}; 

Однако я хотел бы реализовать структура B за пределами области видимости функции. Если бы это был просто вложенный класс в A я мог бы сделать что-то вроде:

class X { 
    void foo(); 
    class Y; 
} 
class X::Y { 
    void bar() { std::cout << "Bar!" << endl; } 
} 

Но я не могу работать, если это возможно сделать подобную вещь для класса B. Компилятор говорит мне, что тип этого класса A::foo::B но если я пытаюсь определить, что класс я сказал, что foo не является членом A:

Попытка:

class A { 
    void foo(); 
}; 

class A::foo::C { 
    void bar() { std::cout << "Bar!" << std::endl; } 
}; 

void A::foo() { 
    class C; 
    C c; 
    c.bar(); 
} 

ошибки:

test.cpp(15) : error C3083: 'foo': the symbol to the left of a '::' must be a type 
test.cpp(15) : error C2039: 'C' : is not a member of 'A' 
    test.cpp(6) : see declaration of 'A' 
test.cpp(19) : error C2079: 'c' uses undefined class 'A::foo::C' 
+4

Это невозможно, потому что в первом примере класс 'B' на самом деле не вложен внутри класса' A'. Он локален внутри функции «A :: foo», поэтому все определение должно быть внутри этой функции. –

+0

Это невозможно, так как 'B' является локальным для метода' bar'. –

+0

Поместите 'B' в неназванное пространство имен в области файлов. – Jarod42

ответ

2

Это невозможно. Имя C не отображается за пределами функции функции foo. И в отличие от классов, теперь есть возможность получить доступ к области функций извне этой функции.

Обратите внимание, что A абсолютно не относится к вашему примеру. Если foo была функцией пространства имен, результат был бы точно таким же.

Если вам нужен локальный класс функции, вы должны полностью реализовать его внутри этой функции.