Двухэтапный шаблонный псевдоним не разрешается в конструкторе? - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь работать с двухэтапным шаблонным псевдонимом, но не могу получить псевдоним для принятия в качестве параметра конструктора.Есть ли способ сделать это?

Пример того, что я пытаюсь сделать, виден в следующем коде:

#include <memory>

template <typename Bar>
class Foo
{
public:
   using FooPtr = std::shared_ptr<Foo<Bar> >;

   static FooPtr getFooPtr(Bar someBar) { return std::make_shared<Foo<Bar> >(someBar); }
   Foo(Bar bar) : _bar(bar) {}

   Bar getBar() { return _bar; }

private:
   Bar _bar;
};

template <typename Bar>
class Foobar
{
public:
    using FB = Foo<Bar>;
    Foobar(FB::FooPtr fooPtr)
       : _fooPtr(fooPtr)
    {
    }

    FB::FooPtr getFooPtr() { return _fooPtr; }

private:
    FB::FooPtr _fooPtr;
};

int main()
{
   Foobar myFoobar<int>(f::getFooPtr(4));
   return myFoobar.getFooPtr()->getBar();
}

Когда я компилирую это с помощью g ++, я получаю следующее:

dev@ubuntu:~/test/fsm$ g++ -std=c++1z test.cpp
test.cpp:23:23: error: expected ‘)’ before ‘fooPtr’
     Foobar(FB::FooPtr fooPtr)
                       ^
test.cpp:28:5: error: need ‘typename’ before ‘Foobar<Bar>::FB::FooPtr’ because ‘Foobar<Bar>::FB’ is a dependent scope
     FB::FooPtr getFooPtr() { return _fooPtr; }
     ^
test.cpp:31:5: error: need ‘typename’ before ‘Foobar<Bar>::FB::FooPtr’ because ‘Foobar<Bar>::FB’ is a dependent scope
     FB::FooPtr _fooPtr;
     ^
test.cpp: In function ‘int main()’:
test.cpp:36:11: error: missing template arguments before ‘myFoobar’
    Foobar myFoobar<int>(f::getFooPtr(4));
           ^
test.cpp:37:11: error: ‘myFoobar’ was not declared in this scope
    return myFoobar.getFooPtr()->getBar();

Компилятор не распознает псевдоним FB в конструкторе Foobar?Или это проблема с разрешением типа Foo :: FooPtr?

Спасибо!

...