【问题标题】:undefined reference to full template specialization class member function, but not partial specialization对完整模板特化类成员函数的未定义引用,但不是部分特化
【发布时间】:2019-07-23 02:14:25
【问题描述】:

所以我在使用具有完整模板类专业化的模板显式实例化时遇到未定义的引用错误,但问题是,部分模板类专业化运行良好且没有错误。

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

提前致谢。

// 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。

【问题讨论】:

  • 请包含构建链详细信息:编译器?链接器?标志?
  • @Yakk-AdamNevraumont 最后添加,谢谢
  • 不要把 using 指令放在这样的头文件中。

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


【解决方案1】:

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

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

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

编译器历来对此“松懈”,也就是说,有时它会完成您对所有源文件的分析所期望的结果。

您在这个特定的编译器中发现了这种意外“支持”的优势。

【讨论】:

  • 你能告诉我如何修改上面的代码来实现标准化吗?也就是说,如何在每个翻译单元中声明部分和显式特化?提前致谢
  • @NiuChong:既然可以先声明再定义,就可以在header中做一次:edited。
  • 我在头文件末尾添加了您提供的代码,但它得到了另一个错误'错误:聚合'A a'类型不完整,无法定义'
  • @NiuChong:对不起,我只想防止 linker 错误。如果您需要在(大部分)客户端翻译单元中完成特化,只需将特化 definitions 放在标题中,就像任何其他类一样。
  • 谢谢,我猜我还是需要修改上面的模板类特化的用法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-11
  • 2012-12-15
  • 1970-01-01
  • 2012-04-03
  • 1970-01-01
相关资源
最近更新 更多