我希望有人可以指出在模板类中专门化方法的正确方法,同时使用"extern模板类"和"模板类"进行gnu c ++的显式实例化.我试图通过模仿我真实问题的最简单的例子来解决这个问题.似乎声明"extern模板"意味着模板实例化,这在专门化方法时会导致错误.给出一个驱动程序:
main.cc
#include A_H
#include <iostream>
int main()
{
A<int> ai;
A<long> al;
std::cout << "ai=" << ai.get() << " al=" << al.get() << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
以及A的以下实现
啊
template<typename T>
struct A
{
int get() const;
};
extern template class A<int>;
extern template class A<long>;
Run Code Online (Sandbox Code Playgroud)
a.cc
#include "a.h"
template<typename T>
int A<T>::get() const
{
return 0;
}
template<>
int A<long>::get() const
{
return 1;
}
template class A<int>;
template class A<long>;
Run Code Online (Sandbox Code Playgroud)
使用g ++ 4.1.2或4.4.4编译时收到以下错误
% g++ …Run Code Online (Sandbox Code Playgroud) 以下代码是在g ++ 4.1.2和g ++ 4.4.4上编译的.两者都给出了评论中指出的结果.
int f(const int * a)
{
return 0;
}
template<typename A>
int f(A a)
{
return 1;
}
int main()
{
int x;
// return f(&x); // returns 1
return f((const int *)&x); // returns 0
}
Run Code Online (Sandbox Code Playgroud)
它似乎归结为做出f(int *)决议f<int *>(int *)而不是预期的召唤f(const int *).我发现这令人震惊,完全不直观.
这是g ++中的一个错误,是C++的一个黑暗角落,还是由于某种原因我很遗憾?如果它不是一个错误,它背后的理论或逻辑是什么?有关此问题的安全措施吗?