2014-03-16 3 views
-1

Я недавно начал создавать макросы и шаблоны. Я сделал приложение с использованием шаблона, в котором вы вводите два целых числа с разными типами данных, и он сообщает вам, какой из них больше. Но каждый раз, когда я выполняю код, он дает мне эту ошибку.C++ Шаблоны с несколькими параметрами

Ошибка 1 ошибка C2371: 'comp': redefinition; различные базовые типы линии: 36 Колонка: 1

и вот мой код

#include <iostream> 
using namespace std; 

template<typename T, typename B> 
class Compare{ 
public: 
    Compare(const T& hAge1, const B& hAge2){ 
     age1 = hAge1; 
     age2 = hAge2; 
    } 
    void display_result(){ 
     if (age1 > age2){ 
      cout << "Your age is bigger" << endl; 
     } 
     else{ 
      cout << "Your age is smaller" << endl; 
     } 
    } 
private: 
    T age1; 
    B age2; 
}; 

int main(){ 
    int your_age; 
    int someother_age; 
    //user interface 
    cout << "Enter your age: "; 
    cin >> your_age; 
    cout << "Enter some other age: "; 
    cin >> someother_age; 
    /*create instance of class Comepare*/ 
    Compare<int,double>comp(your_age, someother_age); 
    comp.display_result(); 
    //create another instance 
    Compare<int, int>comp(your_age, someother_age); 
    comp.display_result(); 
    system("pause"); 
    return 0; 
} 
+1

Ваш пример может быть сведен к 'int main() {int a; double a;} 'или аналогичный. Это та же проблема, и это ошибка времени компиляции, а не ошибка времени выполнения. – chris

+0

Ваш компилятор сообщает вам, в чем проблема. Он даже сообщает вам, по какой строке и какой символ переопределяется. И чтобы сделать проще, первое определение - это всего лишь несколько строк выше. ** Это не может быть проще. ** – Phil1970

ответ

2

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

{ 
    /*create instance of class Comepare*/ 
    Compare<int,double>comp(your_age, someother_age); 
    comp.display_result(); 
} 
{ 
    //create another instance 
    Compare<int, int>comp(your_age, someother_age); 
    comp.display_result(); 
} 

Конечно, вы также можете просто назвать свои объекты по-другому, а не повторное использование имени comp, который не является слишком описательной в любом случае (вычислить, сравнить, совместимый, комп ...).

+0

Когда я переименую второй экземпляр сравнения с другим объектом i.e 'com'. Он работает, но он также отображает вывод первого сравнительного экземпляра comp и вывод второго «ком» – Jim

+0

@jim И что вы ожидаете? Код делает именно то, что вы ему сказали? ** И, очевидно, в вашем случае ответ будет таким же, если вы используете ints или doubles. ** – Phil1970

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