2017-02-08 13 views
3

Как-то я не могу создать экземпляр D. Я не знаю почему. Проблема шаблона-шаблона (Allocator_class) представляется проблемой.Невозможно вызвать конструктор (параметр шаблона шаблона)

#include <vector> 

template <template<typename T> class Allocator_class> 
class T_b { 
public: 
    template<typename T> using A = Allocator_class<T>; 
}; 

template< template <typename T> class A> 
class C { 
public: 
    C() { } 
}; 

template<typename Ttb> 
class D { 
public: 
    template<typename T> using A = typename Ttb::template A<T>; 
    typedef C<A> Data; 

    D(C<A> &data) : _data(data) {} 
private: 
    Data &_data; 
}; 

int main() { 
    typedef T_b<std::allocator> Ttb;  
    C<std::allocator> b; 
    D<Ttb>c(b); 
} 

Ошибка с Clang:

test5.cpp:29:8: error: no matching constructor for initialization of 'D<Ttb>' 
     (aka 'D<T_b<std::allocator> >') 
     D<Ttb>c(b); 
      ^~ 
test5.cpp:16:7: note: candidate constructor (the implicit copy constructor) not viable: no known 
     conversion from 'C<std::allocator>' to 'const D<T_b<std::allocator> >' for 1st argument 
class D { 
    ^
test5.cpp:16:7: note: candidate constructor (the implicit move constructor) not viable: no known 
     conversion from 'C<std::allocator>' to 'D<T_b<std::allocator> >' for 1st argument 
class D { 
    ^
test5.cpp:21:5: note: candidate constructor not viable: no known conversion from 'C<std::allocator>' 
     to 'C<A> &' for 1st argument 
    D(C<A> &data) : _data(data) {} 
    ^
+0

есть причина, по которой это происходит? –

+0

Возможно, [не выводимый контекст] (http://stackoverflow.com/questions/25245453/what-is-a-nondeduced-context)? –

ответ

1

Я не могу объяснить, почему ваш код выдает ошибку.

Но если вы хотите, решение ... используя класс специализации и параметр шаблона шаблон шаблон ....

#include <vector> 

template <template<typename T> class Allocator_class> 
class T_b 
{ 
    public: 
     template<typename T> using A = Allocator_class<T>; 
}; 

template <template <typename T> class A> 
class C 
{ 
    public: 
     C() { } 
}; 

template <typename> 
class D; 

template <template <template <typename> class> class X, 
      template <typename> class A> 
class D<X<A>> 
{ 
    public: 
     using Data = C<A>; 

     D (Data & data) : _data(data) {} 

    private: 
     Data & _data; 
}; 

int main() 
{ 
    typedef T_b<std::allocator> Ttb;  

    C<std::allocator> b; 

    D<Ttb> c(b); 
} 
+0

Я все смущен, когда смотрю на этот код, но я рад, что это может сработать. Просто не знаю, почему ... –

+0

@rxu - это только еще один уровень храпования; аргумент шаблона для 'D' является типом шаблона с аргументом, который не является типом, а шаблоном-шаблоном. Таким образом, аргумент шаблона 'D' является (если я могу использовать это выражение) шаблоном-шаблоном-шаблоном с аргументом шаблона-шаблона. В моем примере (специализация) показано, как извлечь аргумент шаблона-шаблона аргумента 'D'. Разве это не ясно? :( – max66

+0

Я получаю это сейчас. –