小编Rol*_*and的帖子

使用"extern模板"时,对模板进行专门化的正确方法是什么?

我希望有人可以指出在模板类中专门化方法的正确方法,同时使用"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)

c++ templates c++11

21
推荐指数
1
解决办法
1万
查看次数

使用非const指针调用函数会通过指向const的指针函数转换为模板函数

以下代码是在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++的一个黑暗角落,还是由于某种原因我很遗憾?如果它不是一个错误,它背后的理论或逻辑是什么?有关此问题的安全措施吗?

c++

7
推荐指数
2
解决办法
182
查看次数

标签 统计

c++ ×2

c++11 ×1

templates ×1