В 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-му примеру объявления.
Разве вам не разрешено иметь функцию в классе шаблона, который принимает тип, отличный от класса? Я чрезвычайно заинтересован в том, чтобы узнать, что здесь происходит, и что-нибудь важное о шаблонах, которое я могу извлечь из этой ошибки
У вас есть два типа шаблонов: 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); }
Вам нужно два отдельных объявления шаблона:
template <class T>
template <class G>
inline G Vector2<T>::Dot(const Vector2<G>& U, const Vector2<G>& V) {...}