【问题标题】:Specialization Function Calls from other functions来自其他函数的专业化函数调用
【发布时间】:2016-09-19 00:20:56
【问题描述】:

我试图找出从另一个调用模板专业化函数。在接下来的短片中,我尝试从 RED 调用 BLACK 特定函数。我收到以下编译器错误

无法调用成员函数bool noClass<color>::_open() [with Colors color = (Colors)2]’ without object

这很有意义。如何(或我可以)从 RED 呼叫 BLACK 工作?下面的代码段来自 noClass C++ 标头。

#ifndef COLORS_H
#define COLORS_H

enum class Colors { RED, GREEN, BLACK };

#endif /* COLORS_H */

#ifndef NOCLASS_H
#define NOCLASS_H


    template <Colors color> 
    class noClass {
        public: bool Open ( );
        protected: bool _open ( );
    };

    template <Colors color> bool noClass<color>::Open ( ) { return noClass<color>::_open ( ); }

    template <Colors color> bool noClass<color>::_open ( ) { return true; }

    template <> inline bool noClass<Colors::BLACK>::_open ( ) { return true; }

    template <> inline bool noClass<Colors::RED>::_open ( ) { return noClass<Colors::BLACK>::_open( ); }

#endif /* NOCLASS_H */

【问题讨论】:

    标签: c++ templates specialization


    【解决方案1】:

    你不能,因为你没有所需类型的实例。尝试在辅助函数中编写您的通用代码,并让两种专业化都调用它。

    【讨论】:

    • 我确信这就是答案;编译器很少撒谎。另一方面,那里有一些非常聪明的人,我知道到底是什么,问起来也无妨。希望我能提高“答案很有用”,但作为最近的注册者,我不允许。谢谢!!
    • @NonSequitur:您尝试调用的函数是一个非静态成员函数,因此它有一个“隐藏的 this”参数,该参数必须绑定到 noClass&lt;Colors::BLACK&gt; 的实例。并且同一模板的不同实例是不相关的(即使它们的类型模板参数通过继承相关——C++ 模板不是协变的)。可以让一个模板特化从另一个继承,但这在这里感觉不是一个好的解决方案。您可能会考虑制作一个通用基类来保存共享实现。看看CRTP
    • 代表奇怪重复的模板模式。它允许基类中的共享实现访问派生类的成员。
    • 会以某种方式使用复制构造函数(如果有的话)是一种可能的解决方案吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 2023-01-19
    相关资源
    最近更新 更多