继承的可变参数模板中基本成员的名称隐藏
Name hiding of base member in inherited variadic template
我有以下适用于 VS2017 的代码:
template <typename ... Args>
struct Composite: Args...
{
using Composite<Args...>::foo;
void foo(float exposure)
{
return this->foo(*this, exposure);
}
void internalBar(float e) { std::cout << "it works" << e; }
};
这样使用:
struct A
{
template <typename T>
void foo(T& device, float exposure)
{
device.internalBar(exposure);
}
};
struct B
{};
struct C
{};
int main(int argc, char *argv[])
{
auto u = Composite<A, B, C>();
u.foo(5.0f);
return 0;
}
问题出在行 using Composite::foo 因为它不在 c++ 标准中。这就是它不适用于 gcc 的原因:Composite 不是 Composite.
的基础 class
我不得不使用这一行,因为 Composite 隐藏了 A 的 foo。
如何拉入单个打包参数的范围?
谢谢。
您可以通过添加一个间接级别来解决很多问题。
template <typename ... Args>
struct CompositeFooWrapper: Args...
{
};
template <typename ... Args>
struct Composite: CompositeFooWrapper<Args...>
{
using CompositeFooWrapper<Args...>::foo;
我有以下适用于 VS2017 的代码:
template <typename ... Args>
struct Composite: Args...
{
using Composite<Args...>::foo;
void foo(float exposure)
{
return this->foo(*this, exposure);
}
void internalBar(float e) { std::cout << "it works" << e; }
};
这样使用:
struct A
{
template <typename T>
void foo(T& device, float exposure)
{
device.internalBar(exposure);
}
};
struct B
{};
struct C
{};
int main(int argc, char *argv[])
{
auto u = Composite<A, B, C>();
u.foo(5.0f);
return 0;
}
问题出在行 using Composite
我不得不使用这一行,因为 Composite 隐藏了 A 的 foo。
如何拉入单个打包参数的范围?
谢谢。
您可以通过添加一个间接级别来解决很多问题。
template <typename ... Args>
struct CompositeFooWrapper: Args...
{
};
template <typename ... Args>
struct Composite: CompositeFooWrapper<Args...>
{
using CompositeFooWrapper<Args...>::foo;