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>{})
{ }