неопределенная ссылка на функцию-член класса полной специализации шаблона, но не частичная специализация - PullRequest
0 голосов
/ 01 марта 2019

, поэтому я получил неопределенную ссылочную ошибку при использовании явной реализации шаблона с полной специализацией класса шаблона, но вопрос в том, что частичная специализация класса шаблона проходит без ошибок.

код показывает, как показано ниже, кто-нибудь знает почему?В чем разница между полной специализацией и частичной специализацией в этой ситуации?

Заранее спасибо.

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

Команды компиляции g++ t.cpp t2.cpp -o t с gcc 4.8.5.

1 Ответ

0 голосов
/ 02 марта 2019

Вы должны объявить частичные и явные специализации в каждой единице перевода, которая их использует (перед любым использованием, которое неявно было бы созданоэта специализация).Здесь это выглядело бы как

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

сразу после первичного шаблона (чтобы избежать любой возможности ошибочной неявной реализации.

Компиляторы исторически были «слабы» в этом, то естьчто иногда он делает то, что вы ожидаете от анализа всех исходных файлов вместе.

Вы нашли преимущество такой случайной «поддержки» в этом конкретном компиляторе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...