C++ 在简单继承情况下,模板参数推断/替换失败

C++ 在简单继承情况下,模板参数推断/替换失败,c++,templates,c++11,C++,Templates,C++11,这是我最简单的例子: #include <type_traits> class Base { public: template<typename T> using Storage = typename std::aligned_storage<sizeof(T), alignof(T)>::type; template<typename T> Base(Storage<T>*) {} };

这是我最简单的例子:

#include <type_traits>

class Base
{
public:

    template<typename T>
    using Storage = typename std::aligned_storage<sizeof(T), alignof(T)>::type; 

    template<typename T>
    Base(Storage<T>*)
    {}
};

template<typename T>
class Derived : public Base
{
public:

    using Storage = Storage<T>;

    Derived(Storage* storage) :
            Base{storage}
    {}
};

int main()
{
    Derived<int>::Storage storage;  
    Derived<int> derived {&storage};
}

你知道怎么解决吗?这看起来很简单,但编译器无法处理它。。。我在对象的构造中尝试了一些奇怪的转换,或者修改了
派生的
构造函数的定义,但是错误表明我走错了方向…

您的
使用
别名在
类构造函数中引入了一个非推断上下文。这会导致替换失败,因为无法推断
T
。一种解决方案是通过标签调度通过另一个参数推断
T

template<typename T>
struct no_decay { };

class Base
{
    // ...
public:
    template<typename T>
    Base(Storage<T>*, no_decay<T>);
};

// ...

Derived(Storage* storage)
    : Base(storage, no_decay<T>{})
{ }
模板
结构无衰变{};
阶级基础
{
// ...
公众:
模板
基础(储存*,无腐蚀);
};
// ...
派生(存储*存储)
:Base(存储,无衰变{})
{ }

现在,
T
将由第二个参数推导,而不是第一个参数。

构造函数参数中有一个未推导的上下文。@0x499602D2-有任何解决方案的建议吗?我在网上找到的关于这方面的信息不是很有帮助…好的,很好-这确实有帮助。我假设问题的根本原因是
T
存在于“外部”模板中,但我将
..::type
内部类型传递到构造函数中,构造函数另外只使用
T
的大小和对齐方式,对吗?或者这仅仅是因为
T
sizeof()
alignof()
中使用,而其他什么都不重要?我有没有办法使用这个技巧而不引入新的
no\u decay
类型?也许STL中有我可以使用的东西?@FreddieChopin问题是,你有一个嵌套的名称说明符作为依赖类型名,根据定义,它是不可推断的。使用
no_decation
模板的原因是1)为了防止不必要地构造
T
对象来推断其类型,2)因为构造函数不能采用显式模板参数,所以需要推断所有类型。因此,
无需衰减
。另一种方法是让
Base
成为一个模板,使用
T
,并使用
别名和构造函数从
中删除
模板。@FreddieChopin有帮助吗?不幸的是,我需要Base是非模板的,所以您的原始解决方案比这个要好。
template<typename T>
struct no_decay { };

class Base
{
    // ...
public:
    template<typename T>
    Base(Storage<T>*, no_decay<T>);
};

// ...

Derived(Storage* storage)
    : Base(storage, no_decay<T>{})
{ }