gpt4 book ai didi

c++ - 使用特殊类中的类模板的内部类型

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:28:39 25 4
gpt4 key购买 nike

编辑:我去度假时实际上没有机会测试任何建议的解决方案,当我回来时,负责类模板的人进行了一些更改,使我能够绕过使用类模板本身中定义的类型的需要。

感谢大家的帮助。


简而言之 - 请随时纠正我的措辞,模板对我来说仍然有点巫术, - 我需要知道我是否可以使用 (protected) struct#typedef 在我的专业类的类模板中定义。例如:

这是类模板:

template<typename T>
class A : public C<T>
{
protected:
struct a_struct { /* Class template implementation, doesn't depend on T */ };
void foo( a_struct a );
};

我需要完全专注于 T = VAL:

template<>
class A< VAL > : public C< VAL >
{
void foo( a_struct a )
{
// My implementation of foo, different from the class template's
}
};

但是,如果我这样做,编译器会提示 a_struct 在我的专用类中未定义。我尝试从类模板中进行特化和继承,但是那变得......困惑。

我看到了一些解决方案,但所有解决方案都涉及修改类模板,这是我无法轻易做到的(不同的团队)。

想法?

最佳答案

不,您不能在类模板的特化中使用主模板声明的成员。这是因为本质上,模板类特化声明了一个全新的类模板,当模板参数与特化匹配时应用该模板。

不过,如果您想执行示例中的操作,您有两个选项可用:

  • 您可以特化模板类成员函数。如果确实只有一个成员函数是特殊的(或者至少成员函数的数量是有限的),这将很有用。
  • 您可以将成员 (-type) 的声明放在一个公共(public)基类中。

由于您在编辑中指出您无法更改类模板本身,因此专门化成员函数似乎是最佳选择。

一个简化的example仅专门化一个成员函数

template< class T>
class Printer
{
public:
struct Guard {};
void DoPrint( const T& val)
{
Guard g;
(void)g;
std::cout << val << '\n';
}
};

struct Duck {};

template<>
void Printer<Duck>::DoPrint( const Duck& val)
{
Guard g;
(void)g;
std::cout << "Some duck\n";
}

此处的Guard 仅用于演示此类型可用于DoPrint() 的主要实现和专用实现。

关于c++ - 使用特殊类中的类模板的内部类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34419155/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com