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

时间:2018-03-16 20:44:58

标签: c++ templates struct

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

更重要的是,我使用的是Funct.Methd(const auto,& 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>>

我将不胜感激。

3 个答案:

答案 0 :(得分:2)

C ++中的所有变量从声明时起都有固定的类型。

模板不是类型。模板是关于如何制作类型的说明。

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

const auto x = foo();

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

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

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

有效,因为x的类型可以在声明x的地方确定。

简而言之,const auto并非如此。

有可能做你真正想做的事情,但它可能是 hard ,你可能缺乏描述你真正想要的词汇。我的建议是不要与语言作斗争并使用固定类型。

答案 1 :(得分:2)

主要内容是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,而是创建了类的特定版本。

答案 2 :(得分:0)

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

const auto不是“变量类型”。 auto是一个关键字,可根据您提供的某些信息启用某种类型的扣除。例如,它知道5int(因为它们是规则),因此auto x = 5;是可能的。

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