尽管存在显式实例化,但类模板的成员函数模板找不到定义。不连结

时间:2019-01-07 20:36:07

标签: c++ templates visual-c++ c++17 explicit-instantiation

编辑:这不是链接问题的重复,因为我使用的是显式实例化,只有特定类型的成员函数不链接(其他人则链接)。

以下代码可以编译,但无法链接,我也不明白为什么。 它显式实例化buttonfps2397.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String setFps2397 = "23,97"; editTextFpsEntry.setText(setFps2397); dismiss(); // <---- closes the dialog } }); 类以限制Vector的可能参数的数量,因此将T的定义隐藏在.cpp文件中。

Vector<T>

我得到的错误是:

// 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 };
}

我正在使用 VS 15.9.4 中的 VC ++ 17 进行编译。

请注意,对不是功能模板的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) 成员的调用会正常链接。

1 个答案:

答案 0 :(得分:2)

除了template<typename T> template<typename U> Vector<T> Vector<T>::operator+(const Vector<U> & other) const类的显式实例之外,还应使用方法T的显式实例(对于UVector<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专业化。