错误:使用未声明的标识符'T'

error: use of undeclared identifier 'T'

本文关键字:标识符 未声明 错误      更新时间:2023-10-16

我是使用带有结构的模板的新手。我的主要目标是在结构内部拥有自动变量。

更重要的是,我正在使用Funct.Methd(const auto, and Handler(的库函数。在这里,如您所见,在第一个参数的位置,我想传递(基于某些标准(用户创建的任何 const 自动变量。我预计有超过 20 个变量,根据某些标准,将使用任何 5 个变量。

经过一些研究,我发现我可以使用模板来实现此目的。请在下面找到示例代码:

#include <iostream>
#include <string>
template<typename T>
struct FTmr {
    T query;
};
int main()
{
    FTmr<T> df;    
}

我在将模板与结构一起使用时use of undeclared identifier 'T'出现错误。首先我需要解决上述错误,然后我想使用 const auto。

我希望用 df 名称实例化 FTmr,然后访问查询变量。

df.query=<<const auto value>>

我将不胜感激任何帮助。

C++中的所有变量从声明的那一刻起都具有固定的类型。

模板不是类型。 模板是有关如何创建类型的说明。

const auto变量的类型由您分配给它的内容决定:

const auto x = foo();

x的类型是固定的,它是由固定返回类型foo()推导的。 语言只是为你找到它。

结构的成员是一个变量。 它必须在声明时在结构中确定其类型。 在使用它之前,不能推迟其类型。

struct Foo {
  static const auto x = 3;
};

这是因为x的类型可以在声明x的位置确定。

简而言之,const auto不是那样工作的。

也许可以做你真正想做的事情,但这可能很难,你可能缺乏词汇来描述你真正想要做什么。 我的建议是不要与语言作斗争,而是使用固定类型。

> 主要的T是什么?您必须在使用之前定义它。上一个T的范围限定为上述templated struct。您也不能以这种方式使用;您必须以这种方式实例化模板化结构:

FTmr<int> df;
FTmr<char> df;
// ...

T 是模板化参数,这意味着如果将变量传递给函数,则意味着传递type。因此,编译将创建具有传递 int 类型的结构的实例。

  • 函数以这种方式将变量作为参数:

    void foo(int x, char y, double z, struct foo& the foo, long* pBar, ...);   
    
  • 模板采用types作为参数:

    template< class T> void Power(T& x);
    template < typename U, typename V>
    class Baz{
        U _uval;
        V _vVal;
    };
    

因此,当实例化模板化类/函数时,编译器将创建一个具有该类型的实例:

    Baz<int, std::string> bistr;

编译器创建的实例:

class Baz{
    int _uval;
   std:: string _vVal;
};
  • 请记住,在编译时没有模板或类型 T,而是创建类的特定版本。

tl;dr:模板不会读懂你的想法。你仍然必须告诉他们该怎么做。

const auto不是"变量类型"。 auto是一个关键字,可以从您提供的某些信息中推断出类型。例如,它知道5是一个int(因为它们是规则(,所以auto x = 5;是可能的。

在这种情况下,您根本没有提供任何信息。你认为它应该如何知道T使用什么?我们甚至不知道!你知道吗?query应该是什么?它应该怎么做?仔细考虑,然后让您的计算机知道您的决定。