错误 C2065:模板函数中未声明的标识符

error C2065: undeclared identifier in template function

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

我是C++的新手,我试图把一个小项目放在轮子上,但我很难处理这些错误,我不知道我做错了什么。我想,我已经包含了所有必要的头文件。我做错了什么?

提前谢谢你!

d:filesvisual studio 2010projectscalculatoraplicatie.cpp(31): error C2065: 'CmdAritmetice' : undeclared identifier

d:filesvisual studio 2010projectscalculatoraplicatie.cpp(31): error C2062: type 'int' unexpected

d:filesvisual studio 2010projectscalculatoraplicatie.cpp(37): error C2065: 'cmd1' : undeclared identifier

d:filesvisual studio 2010projectscalculatoraplicatie.cpp(37): error C2228: left of '.Execute' must have class/struct/union

type is ''unknown-type''

编辑

如果我用UI::CmdAritmetice<Calcule::Suma<int>> cmd1("+");修改CmdAritmetice <int, Suma> cmd1("+");,则在尝试编译时会出现以下错误:

1>d:filesvisual studio 2010projectscalculatoraplicatie.cpp(32): error C2440: 'specialization' : cannot convert from 'T (__cdecl *)(T,T)' to 'int (__cdecl *)(int,int)'
1>          None of the functions with this name in scope match the target type
1>d:filesvisual studio 2010projectscalculatoraplicatie.cpp(39): error C2660: 'Calculator::UI::CmdAritmetice<Operatie>::Execute' : function does not take 1 arguments
1>          with
1>          [
1>              Operatie=0x0
1>          ]

主.cpp

#include "aplicatie.h"
using namespace Calculator;
int main()
{
    Aplicatie app;
    app.Run();
    return 0;
}

应用程序.cpp编辑

#include <iostream>
#include "aplicatie.h"
#include "Calculeoperatii.h"
#include "UIcmdaritmetice.h"
using namespace std;
namespace Calculator{
(...)
    void Aplicatie::Run()
    {
        TestSuma();
        CmdAritmetice <int, Suma> cmd1("+");     //here i have errors
        cmd1.Execute("Introduceti doua numere intregi (x, y)");
    }
    void Aplicatie::TestSuma()
    {
        int x = 10, y = 20;
        int r = Calcule::Suma(x,y);
    }    
}

CMDARITMETICE.h

#ifndef ARITMETICE_H
#define ARITMETICE_H
#include "UIcomanda.h"
namespace Calculator{
    namespace UI{
        template<int Operatie(int, int)>
        class CmdAritmetice : public ComandaCalcule
        {
        public:
            CmdAritmetice(const string &nume) : ComandaCalcule(nume)
            {
            }
            void Execute()
            {
            cout << Nume() << endl;
            cout << "Introduceti doua numere intregi (x, y)n";
            int x, y;
            cin >> x >> endl;
            cin >> y >> endl;
            cout << x << " " << Nume() << " " << y << " = " << Operatie (x,y) <<endl;
            }
        };
    }
}
#endif

**operatii.h**
#ifndef OPERATII_H
#define OPERATII_H
namespace Calculator{
    namespace Calcule{
    template<typename T>
    T Suma(T x, T y)
    {
        return x + y;
    }
}
#endif

CmdAritmetice 在命名空间Calculator::UI中定义,而Aplicatie在命名空间Calculator中定义。因此,您必须将CmdAritmetice称为Calculator命名空间中的UI::CmdAritmetice

至于错误说找不到Suma,你还没有发布Suma的定义,所以很难说那里发生了什么,但检查以确保它也没有定义在某个嵌套命名空间中。

编辑:
CmdAritmetice的定义是

template<int Operatie(int, int)>
class CmdAritmetice : public ComandaCalcule
{
    // ...
};

所以它需要一个模板参数,它是带有签名int(int, int)的函数,即一个接受 2 int s 并返回一个 int 的函数。在Aplicatie::Run()中,您尝试将类实例化为

CmdAritmetice <int, Suma>

显然这是行不通的,模板参数必须是与您在定义中指定的签名匹配的函数。此外,对Suma的引用需要限定为 Calcule::Suma

我认为你打算做的是

UI::CmdAritmetice<Calcule::Suma<int>> cmd1("+");