作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编辑:这不是链接问题的拷贝,因为我使用的是显式实例化并且只有特定类型的成员函数不链接(其他链接)。
以下代码编译但不链接,我不明白为什么。它显式实例化了 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)
我在 VS 15.9.4 中使用 VC++ 17 进行编译。
请注意,调用 Vector<int>
的成员不是函数模板的链接可以正常链接。
最佳答案
您应该使用方法的显式实例 template<typename T> template<typename U> Vector<T> Vector<T>::operator+(const Vector<U> & other) const
(对于所有可能的 T
和 U
对)除了 Vector<T>
的显式实例类:
template Vector<int> Vector<int>::operator+(const Vector<short> & other) const;
您也可以简单地移动 Vector<T>::operator+
的定义头文件的方法。
在 C++11 中 extern template
指令被引入。您可以在 Vector<T>
的头文件中使用它类(如 @StoryTeller suggested in the comments ):
extern template struct Vector<int>;
...以防止编译器实例化 Vector<T>
每个翻译单元中的类都使用其特化。当然一样extern template
指令也可用于所有 Vector<T>::operator+
在 .cpp
中显式实例化的特化文件。
关于c++ - 尽管存在显式实例化,但类模板的成员函数模板找不到定义。不链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54081512/
我是一名优秀的程序员,十分优秀!