提问者:小点点

如何引用模板类中尚未定义的符号?


我天真地认为,在模板类内部,我可以引用不存在的对象,因为它们在实例化之前不是必需的。但这不起作用(编译器抱怨未声明的名称):

template<typename H>
class HandlerInfoClass
{
    std::string_view getName()
    {
        return NAME;
    }
};

在不使用预处理器或添加新模板参数(其中一些参数可能具有在此上下文中不允许的类型)的情况下,有没有方法克服这一点?


共2个答案

匿名用户

不可能引用不存在的对象。模板函数的一个关键属性是,对于给定的参数,输出总是相同的。因此,在代码中实例化模板的位置并不重要,它将始终为相同的参数调用相同的函数。

您正在构建的东西看起来像是“处理程序”的trait类。正确的编写方法是为每个不同的类型专门化类,如下所示:

template<typename H>
class HandlerInfoClass;

template<>
class HandlerInfoClass<HandlerType>
{
    static std::string_view getName()
    {
        return "HandlerType";
    }
};

如果您返回的字符串在运行时发生了变化,那么您不应该构建traits类,而是向对象本身添加一个函数。

匿名用户

多亏了通用汽车。我找到了一个很好的变通方法:将“name”作为静态变量放入type中,即模板参数:

template<typename H>
class HandlerInfoClass
{
    std::string_view getName()
    {
        return H::NAME;
    }
};