gpt4 book ai didi

c++ - 为什么我的 C++ 模板函数不会产生 `undeclared identified` 编译错误?

转载 作者:太空狗 更新时间:2023-10-29 20:56:19 25 4
gpt4 key购买 nike

我正在尝试创建一个关于 Lights 的抽象(我正在用 C++ 构建一个游戏)并且我正在使用模板来做到这一点。我现在的部分代码是:

// Light.hpp
template <typename LightType>
void LoadLight(GLuint shaderId, const LightType& light, const std::string& glslUniformName)
{
// Load common light attributes
glUniform3f(glGetUniformLocation(lightingShader.GetProgID(), (glslUniformName + ".ambient").c_str()), light.ambient.x, light.ambient.y, light.ambient.z);
glUniform3f(glGetUniformLocation(lightingShader.GetProgID(), (glslUniformName + ".diffuse").c_str()), light.diffuse.x, light.diffuse.y, light.diffuse.z);
glUniform3f(glGetUniformLocation(lightingShader.GetProgID(), (glslUniformName + ".specular").c_str()), light.specular.x, light.specular.y, light.specular.z);

// Load specific light attributes
LoadLightSpecific<LightType>(shaderId, light, glslUniformName); // ???
}

template <typename LightType>
void LoadLightSpecific(GLuint shaderId, const LightType& light, const std::string& glslUniformName);

LoadLightSpecific 的特化在单独的 .cpp 文件中,与我的问题无关。

我的问题与 ??? 一致。我在定义它之前使用了 LoadLightSpecific!我以为这会给我一个 undeclared identifier (或类似的东西)编译错误但没有。正常工作。

为什么会这样?我觉得我错过了一些明显的东西。

2015 年 11 月 23 日更新

因此,正如人们在评论中推荐的那样,我使用 Wandbox 以最少的代码重现了问题。我结束了 here .显然,我的问题的答案似乎是:

“代码不应该编译但 MSVC 以某种方式解决了这个问题”

最佳答案

在编写模板时,您假设一些关于模板参数的事情并不少见。即:

Template<class T>
class C
{
void foo() { T.bar(); }
};

即使我们不知道 T实际上会有一个方法 bar() ,编译器目前接受它,因为它只是一个"template",而不是实际代码。当您使用一些参数实例化模板时,编译器将检查您假设的正确性,因为现在它必须生成代码。

在函数的情况下,它是相同的。 必须应用相同的逻辑,除非有人在标准中找到关于它的明确声明,我试图找到但没有找到。

如果我们按照这个逻辑,当你写LoadLight的模板时,您假设存在这样一个名为 LoadLightSpecific<T> 的函数.换句话说,

为什么 T.bar()bar<T>()在类模板中被接受,但在函数模板中不被接受?

模板化函数不会在其模板化定义的位置进行翻译,而是在使用某些特定模板参数实际调用时(类似于模板化类的实例化)。如果在那个地方,所有需要的东西都可用(LoadLightSpecific 声明),那么它将正常工作。

但是,我认为最好的做法是尽可能在模板定义的地方声明一些东西。这将使跟踪依赖关系变得更加容易。

关于c++ - 为什么我的 C++ 模板函数不会产生 `undeclared identified` 编译错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33863069/

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