Редактировать: Это не дубликат связанного вопроса, поскольку я использую явное создание экземпляра, и только определенный тип функций-членов не связывается (другие делают).
Следующий код компилируется, но не связывается, и я не понимаю, почему.
Он явно создает экземпляр класса Vector
, чтобы ограничить число возможных аргументов для T
и поэтому скрывает определение Vector<T>
в файле .cpp.
// fwd_decl.hpp
#pragma once
template<typename T>
struct Vector; // Forward declare Vector to be used in other headers
// Vector.hpp
#pragma once
#include "fwd_decl.hpp"
template<typename T>
struct Vector
{
template<typename U> // To allow for other types than T to be used
Vector operator+(const Vector<U> & other) const;
T x;
T y;
// more stuff..
};
// Vector.cpp
#include "Vector.hpp"
template<typename T>
template<typename U>
Vector<T> Vector<T>::operator+(const Vector<U> & other) const
{
return { static_cast<T>(x + other.x), static_cast<T>(y + other.y) };
}
template struct Vector<int>; // Explicitly instantiate Vector<T> with int
// main.cpp
#include "Vector.hpp"
int main()
{
Vector<int> b = Vector<int>{ 2, 3 } + Vector<int>{ 4, 5 };
}
Ошибка, которую я получаю:
1>main.obj : error LNK2001: unresolved external symbol "public: struct Vector<int> __thiscall Vector<int>::operator+<int>(struct Vector<int> const &)const " (??$?HH@?$Vector@H@@QBE?AU0@ABU0@@Z)
Я компилирую с VC ++ 17 в VS 15.9.4 .
Обратите внимание, что вызовы членов Vector<int>
, которые не являются шаблонами функций, связываются нормально.