首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未定义的对完全模板专门化类成员函数的引用,但不是部分专门化。

未定义的对完全模板专门化类成员函数的引用,但不是部分专门化。
EN

Stack Overflow用户
提问于 2019-03-01 04:31:31
回答 1查看 884关注 0票数 3

因此,当使用模板显式实例化和完全模板类专门化时,我得到了一个未定义的引用错误,但问题是,部分模板类专门化没有错误。

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

提前谢谢。

代码语言:javascript
复制
// 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。

EN

回答 1

Stack Overflow用户

发布于 2019-03-02 01:40:56

您必须在中声明部分显式的专门化--使用它们的每个转换单元(在任何隐式实例化该专门化的使用之前)。在这里,看起来就像

代码语言:javascript
复制
template<class T> class A<T,int>;
template<> class A<int,int>;

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

在历史上,编译器一直对此“松懈”,也就是说,有时它会执行对所有源文件进行分析时所期望的结果。

您已经在这个特定的编译器中找到了这种意外的“支持”的边缘。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54937972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档