2014-01-03 3 views
1

Я новичок в C++, и я пытаюсь создать небольшой проект на колесах, но мне сложно с этими ошибками, и я не знаю, что я «Я делаю неправильно. Я думаю, что я включил все заголовочные файлы. Что я делаю неправильно?ошибка C2065: необъявленный идентификатор в функции шаблона

Спасибо заранее!

d:\files\visual studio 2010\projects\calculator\aplicatie.cpp(31): error C2065: 'CmdAritmetice' : undeclared identifier

d:\files\visual studio 2010\projects\calculator\aplicatie.cpp(31): error C2062: type 'int' unexpected

d:\files\visual studio 2010\projects\calculator\aplicatie.cpp(37): error C2065: 'cmd1' : undeclared identifier

d:\files\visual studio 2010\projects\calculator\aplicatie.cpp(37): error C2228: left of '.Execute' must have class/struct/union

type is ''unknown-type''

Редактировать

Если я изменить CmdAritmetice <int, Suma> cmd1("+"); с UI::CmdAritmetice<Calcule::Suma<int>> cmd1("+"); следующие ошибки появляются при попытке компиляции:

1>d:\files\visual studio 2010\projects\calculator\aplicatie.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:\files\visual studio 2010\projects\calculator\aplicatie.cpp(39): error C2660: 'Calculator::UI::CmdAritmetice<Operatie>::Execute' : function does not take 1 arguments 
1>   with 
1>   [ 
1>    Operatie=0x0 
1>   ] 

main.cpp

#include "aplicatie.h" 
using namespace Calculator; 

int main() 

{ 
    Aplicatie app; 
    app.Run(); 
    return 0; 
} 

aplicatie.cpp отредактировал

#include <iostream> 
#include "aplicatie.h" 
#include "Calcule\operatii.h" 
#include "UI\cmdaritmetice.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); 
    }  
} 

с mdaritmetice.h

#ifndef ARITMETICE_H 
#define ARITMETICE_H 
#include "UI\comanda.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 

LE

**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 

ответ

0

CmdAritmetice определен в пространстве имен Calculator::UI в то время как Aplicatie определен в пространстве имен Calculator. Таким образом, вы должны обратиться к CmdAritmetice как UI::CmdAritmetice в пределах пространства имен Calculator.

Что касается ошибки говоря Suma не может быть найден, вы не отправили определение Suma, так что трудно сказать, что там происходит, но проверьте, чтобы убедиться, что это тоже не определенно в пределах некоторых вложенного пространства имен.

EDIT:
Определение для CmdAritmetice является

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

Так оно принимает аргумент шаблона, который является функцией с подписью int(int, int), то есть функция, которая принимает 2 int с и возвращает int. В Aplicatie::Run() попытке создать экземпляр класса как

CmdAritmetice <int, Suma> 

Очевидно, что это не будет работать, то аргумент шаблона должен быть функцией соответствия подписи вы, указанной в определении. Кроме того, ссылки на Suma должны быть указаны как Calcule::Suma.

Я думаю, что вы собираетесь сделать, это

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

Если я изменить строку, как этот 'UI :: CmdAritmetice cmd1 ("+");' я получаю ошибки C2514: «Калькулятор :: UI: : CmdAritmetice ': class не имеет конструкторов. Но это в cmdaritmetice.h 'общественность: CmdAritmetice (константную строка & Nume): ComandaCalcule (Nume) \t \t {}' – Zodrak

+0

@Zodrak Вы не показывайте, что вы включили любые стандартные, кроме '' , и библиотечных коллекторов в одном не содержится определения 'string'. Без определения 'string' компилятор не может знать, что' '+" 'можно преобразовать в' string'. – hvd

+0

@hvd Я включил 'string', но ничего не меняется. он говорит: «Идентификатор cmdAritmetice undefined» – Zodrak

Смежные вопросы