Шаблон может вызвать сбой определения определения функции

В VS2012 с использованием C ++ 11, почему это компилируется:

template <typename T>
class Vector2
{
public:
Vector2();  //constructors

T Dot(const Vector2<T>& U, const Vector2<T>& V);
};

template <typename T>
inline T Vector2<T>::Dot(const Vector2<T>& U, const Vector2<T>& V) //ISSUE
{ return (U.x * V.x + U.y * V.y); }

Но это не так:

template <typename T>
class Vector2
{
public:
Vector2();  //constructors

template<typename G>
G Dot(const Vector2<G>& U, const Vector2<G>& V);
};

template <typename G>
inline G Vector2<G>::Dot(const Vector2<G>& U, const Vector2<G>& V) //ISSUE
{ return (U.x * V.x + U.y * V.y); }

Второе вызывает ошибку: «невозможно сопоставить определение функции с существующим объявлением»
Я понимаю, что мне не нужно использовать G для более позднего определения функции шаблона, я просто использовал его, чтобы соответствовать 2-му примеру объявления.
Разве вам не разрешено иметь функцию в классе шаблона, который принимает тип, отличный от класса? Я чрезвычайно заинтересован в том, чтобы узнать, что здесь происходит, и что-нибудь важное о шаблонах, которое я могу извлечь из этой ошибки

0

Решение

У вас есть два типа шаблонов: T а также G, Один список (T) для класса, и один (G) для функции-члена. Поэтому у вас должно быть два списка; один для класса, затем один для функции (и убедитесь, что правильные типы идут в нужных местах, T после имени класса и G в параметрах):

template<typename T>
template<typename G>
inline G Vector2<T>::Dot(const Vector2<G>& U, const Vector2<G>& V)
{ return (U.x * V.x + U.y * V.y); }
4

Другие решения

Вам нужно два отдельных объявления шаблона:

template <class T>
template <class G>
inline G Vector2<T>::Dot(const Vector2<G>& U, const Vector2<G>& V) {...}
2

По вопросам рекламы [email protected]