未定义对完整模板专业化类成员函数的引用,但未对部分专业化进行引用

时间:2019-03-01 04:31:32

标签: c++ templates template-specialization partial-specialization

因此,在将模板显式实例化与完整模板类专门化一起使用时,出现了未定义的参考错误,但问题是,部分模板类专门化进行得很好而没有错误。

代码如下所示,有人知道为什么吗?在这种情况下,完全专业化和部分专业化有什么区别?

谢谢。

// t.h
#include <iostream>

using namespace std;

template <typename T1, typename T2> 
class A { 
  public:
  void foo();
};

// t2.cpp
#include "t.h"

template<typename T1> 
class A<T1, int> {
  public:
  void foo() {
    cout << "T1, int" << endl;
  }
};

template<>
class A<int, int> {
  public:
  void foo() {
    cout << "int, int" << endl;
  }
};

template class A<float, int>;
template class A<int, int>;

// t.cpp
#include "t.h"

int main() {
  A<float, int> a;
  a.foo();  // no error
  A<int, int> a1; 
  a1.foo(); // undefined reference error, why?
  return 0;
}

在gcc 4.8.5中,编译命令为g++ t.cpp t2.cpp -o t

1 个答案:

答案 0 :(得分:2)

您必须在使用它们的每个翻译单元中声明 partialexplicit专业化(在隐式实例化该专业化的任何使用之前) )。在这里,看起来像

template<class T> class A<T,int>;
template<> class A<int,int>;

紧接在主模板之后(以避免任何可能的错误的隐式实例化。

过去,编译器对此一无所知,也就是说,有时它可以满足您对所有源文件的分析所期望的。

您已经在此特定的编译器中发现了这种偶然的“支持”的优势。