2013-08-01 3 views
1

Почему у меня возникает ошибка компоновщика для следующего?Ошибка создания функции шаблона шаблона

template<typename T, typename U> 
class A { 
public: 
    class B; 
}; 

template<typename T, typename U> 
class A<T, U>::B { 
    friend bool operator==(const B& b1, const B& b2); 
}; 

template<typename T, typename U> 
bool operator==(const typename A<T, U>::B& b1, const typename A<T, U>::B& b2) { 
    return true; 
} 

int main() { 
    A<char, int>::B b1; 
    A<char, int>::B b2; 

    if (b1 == b2) { 
     return 0; 
    } else { 
     return 1; 
    } 
} 

Ошибки я получаю:

Undefined symbols for architecture x86_64: 
    "operator==(A<char, int>::B const&, A<char, int>::B const&)", referenced from: 
     _main in test-qSCyyF.o 

ответ

2

Потому что вы вызываете его, и это не имеет никакого определения!

Этот

template<typename T, typename U> 
class A<T, U>::B { 
    friend bool operator==(const B& b1, const B& b2); 
}; 

является декларация о нешаблонном друга функции A<T,U>::B класса.

Он соответствует вызову (b1 == b2) так же, как и оператор шаблона, который вы определяете ниже, но это предпочтительнее, потому что это не шаблон.

GCC даже выдает предупреждение с -Wnon-template-friend

предупреждение: друг декларации 'BOOL оператором == (Const A :: B &, Const A :: B &)' объявляет нешаблонную функцию [- Wnon-шаблон друг]
Примечания: (если это не то, что вы хотели, убедитесь, что шаблон функции уже был объявлен и добавить <> после имени функции здесь)

Чтобы исправить это обеспечить определение

template<typename T, typename U> 
class A<T, U>::B { 
    friend bool operator==(const B& b1, const B& b2) { 
     return true; 
    } 
}; 

и избавиться от шаблонного оператора ИЛИ оставить только шаблон один.

+0

Итак ... как исправить это. = P – fumoboy007

+0

Я думал, что это будет obvius :) Я обновлю. – jrok

+0

Так что у меня не может быть функция шаблона друга, которая определена вне класса? – fumoboy007

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