简体   繁体   中英

undefined reference to full template specialization class member function, but not partial specialization

so i got an undefined reference error when using template explicit instantiation with full template class specialization, but the question is, partial template class specialization goes well without error.

code shows as below, do anyone know why? what's the difference between full specialization and partial specialization in this situation?

Thanks in advance.

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

the compile commands are g++ t.cpp t2.cpp -ot with gcc 4.8.5.

You have to declare partial and explicit specializations in every translation unit that uses them (before any use that would implicitly instantiate that specialization). Here, that would look like

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

immediately after the primary template (to avoid any possibility of erroneous implicit instantiation.

Compilers have historically been “lax” about this, which is to say that sometimes it does what you'd expect from an analysis of all source files together.

You've found the edge of such accidental “support” in this particular compiler.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM