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

C++ 如何引用模板类中尚未定义的符号?,c++,C++,我天真地认为,在模板类中,我可以引用不存在的对象,因为它们在实例化之前是不必要的。但这不起作用(编译器抱怨未声明的名称): 模板 类句柄信息类 { std::string_视图getName() { 返回名称; } }; 如果不使用预处理器或添加新的模板参数(其中一些参数可能具有此上下文中不允许的类型),是否有任何方法可以克服此问题?否不可能引用不存在的对象。模板函数的一个关键特性是,给定参数的输出总是相同的。因此,无论您在代码中的何处实例化模板,它都会为相同的参数调用相同的函数 您正在构建的

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

模板
类句柄信息类
{
std::string_视图getName()
{
返回名称;
}
};

如果不使用预处理器或添加新的模板参数(其中一些参数可能具有此上下文中不允许的类型),是否有任何方法可以克服此问题?

否不可能引用不存在的对象。模板函数的一个关键特性是,给定参数的输出总是相同的。因此,无论您在代码中的何处实例化模板,它都会为相同的参数调用相同的函数

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

template<typename H>
class HandlerInfoClass;

template<>
class HandlerInfoClass<HandlerType>
{
    static std::string_view getName()
    {
        return "HandlerType";
    }
};
模板
类HandlerInfoClass;
模板
类句柄信息类
{
静态std::string_视图getName()
{
返回“HandlerType”;
}
};

如果在运行时返回的字符串发生更改,则不应构建traits类,而应向对象本身添加一个
getName()
函数。

多亏了G.M。我找到了一个很好的解决方法:将“NAME”作为静态变量放入作为模板参数的类型中:

template<typename H>
class HandlerInfoClass
{
    std::string_view getName()
    {
        return H::NAME;
    }
};
模板
类句柄信息类
{
std::string_视图getName()
{
返回H::NAME;
}
};

也许您只需要一个转发声明?如果没有一个更具体的例子来说明如何准确地使用这个类,很难说。什么是
NAME
?模板参数
H
(在这种情况下使用
H::NAME
)的静态数据成员?请直接在此处提供所有生成消息的完整文本逐字引用。确保您对
名称的理解和期望是显而易见的。如果您认为在定义过程中不需要<代码>名称<代码>,那么演示它在使用这个类时被定义为可使用的。请给编译器一个问题的答案:我应该如何考虑“名称字符串”,因为它不是声明的变量\函数\类等。在C++中,我们不能引用没有声明的东西。“所以,在代码中实例化模板并不重要,它总是为相同的参数调用相同的函数。”谢谢这个句子。现在我想我理解了这个问题。
template<typename H>
class HandlerInfoClass
{
    std::string_view getName()
    {
        return H::NAME;
    }
};