`

特化与multiple definition及

    博客分类:
  • C++
阅读更多
程序员已经习惯于将模板类的实现放到头文件里,但是有一些特化类或特化成员函数的实现如果也随手放到头文件里,则很可能产生multiple definition的错误。
如下所示:
-----------------------------------------
//a.h

#ifndef MYA
#define MYA

template <typename T>
class AA
{
public:
    T v;

    void DoSomething();
} ;

template <typename T>
void AA<T>::DoSomething()
{
    printf("general do something\n");
}

template <>
void AA<int>::DoSomething()
{
    printf("special int do something\n");
}
#endif

----------------------------------------
//b1.h
#ifndef MYB1
#define MYB1
void B1ReferA();
#endif
------------------------------------------
//b1.cpp
#include "b1.h"
#include "a.h"
void B1ReferA()
{
    AA<int> myaa;
    myaa.DoSomething();
}
------------------------------------------
//b2.h
#ifndef MYB2
#define MYB2
void B2ReferA();
#endif
--------------------------------------------
//b2.cpp
#include "b2.h"
#include "a.h"
void B2ReferA()
{
    AA<int> myaa;
    myaa.v = 100;
    myaa.DoSomething();
}
--------------------------------------------
//main.cpp
#include "b1.h"
#include "b2.h"
int main(int argc, char* argv[])
{
    B1ReferA();
    B2ReferA();
    printf("hello world\n");
    int n;
    scanf("%d",&n);
    return 0;
}

上面的文件编译完了之后,会在b1.o和b2.o中都生成AA<int>::DoSomething的代码段,从而产生重复定义的错误。

解决方案是:
第一种:改为
template <> inline
void AA<int>::DoSomething()
{
    printf("special int do something\n");
}
第二种:改为
template <>
void AA<int>::DoSomething();
并且添加a.cpp去实现该函数:
//a.cpp
#include "a.h"
template <>
void AA<int>::DoSomething()
{
    printf("special int do something\n");
}
分享到:
评论

相关推荐

    数组特化模板类

    #### 二、基本概念:泛型容器与数组特化 通常,泛型容器(如`std::vector`)被设计成能够存储任何类型的单个或多个对象。然而,对于那些需要处理特定类型的多个对象的情况,泛型容器可能并不够高效或灵活。例如,当...

    C++模版特化

    ### C++模板特化概述与详解 在C++编程语言中,模板特化是一种非常重要的机制,它允许程序员为特定类型的模板提供定制化的实现。本文将深入探讨C++中的类模板特化,尤其是针对单个模板参数的不同特化类型:特化为...

    C++模板之特化与偏特化详解

    说到C++模板特化与偏特化,就不得不简要的先说说C++中的模板。我们都知道,强类型的程序设计迫使我们为逻辑结构相同而具体数据类型不同的对象编写模式一致的代码,而无法抽取其中的共性,这样显然不利于程序的扩充和...

    深入分析C++模板特化与偏特化

    2. **函数模板的重载与特化区别** - **函数重载**:虽然可以使用普通函数重载来达到类似的效果,但重载函数会始终存在于编译后的二进制文件中,即使未被调用。而模板特化遵循“惰性实例化”,只有在实际使用时才会...

    模板的 主版本模板类、全特化、偏特化

    ### 模板的主版本模板类、全特化、偏特化详解 #### 一、主版本模板类 在 C++ 模板编程中,**主版本模板类** 是一个非常基础的概念。这类模板通常定义了一组通用的功能,可以通过传递不同类型的参数来实现这些功能...

    C++ 类模板、函数模板全特化、偏特化的使用

    本文将深入探讨类模板和函数模板的全特化与偏特化。 一、类模板全特化与偏特化 1. 全特化(Full Specialization) 全特化是指为类模板或函数模板指定一个完全特定的类型参数列表,创建一个独立的非模板类或函数。...

    C++模板特化匹配规则

    C++模板特化匹配规则 C++模板特化匹配规则是指在C++编程语言中,模板的特化过程中,编译器如何选择最合适的模板实例化的规则。这个规则是由C++标准所定义的,目的是为了确保编译器能够正确地选择模板实例化,以便...

    C++模板编程详解:模板函数、类、特化与SFINAE

    内容概要:本文详细介绍了C++中的模板编程技术,包括模板函数、模板类、模板特化、类型推导、SFINAE(Substitution Failure Is Not An Error)以及模板元编程等内容。通过具体的示例代码,帮助读者理解如何编写与...

    函数模板完全特化 C++ Builder 示例

    然而,有时候我们可能需要对特定类型提供优化的实现,这就是函数模板完全特化(Full Template Specialization)的作用。本文将深入探讨C++ Builder中如何实现函数模板的完全特化,并结合给出的代码示例进行解析。 ...

    FunctionDou#STL#8 全特化和偏特化1

    前言关于讲过traits萃取器的时候探讨到偏特化的概念, 而在那一篇文章也没有具体解释偏特化是什么, 怎么实现, 所以可能在第一次看得时候会很莫名其妙. 所以我

    区域分析与规划-广东省各市特化系数.xlsx

    某一部门在地区专业化中的地位以及在全省的地位时采用特化系数分析。亦称区位系数或者特化指数。当LQ=1,说明该地区这一部门人口处于省平均状态;当LQ&gt;1,说明该地区这一部门人口相对集中,处于省特化状态;当LQ,...

    C++模板编程中只特化模板类的一个成员函数

    模板编程中如果要特化或偏特化(局部特化)一个类模板,需要特化该类模板的所有成员函数。类模板中大多数成员函数的功能可能是一模一样的,特化时我们可能只需要重新实现1、2个成员函数即可。在这种情况下,如果全部...

    在C++泛型编程中如何只特化类的某个成员函数

    - 可以创建一个新的模板类,其模板参数与原模板类匹配,但增加了某种限制,使得特化仅针对特定情况生效。然而,这需要为新模板类定义所有成员函数,即使大部分函数与原模板类相同。 ```cpp template&lt;typename T&gt;...

    C++模板与泛型编程详解及实战应用

    主要内容包括模板的概念与优势、函数模板和类模板的声明与实例化、模板元编程、SFINAE原则、模板特化与偏特化、类型推导与auto关键字、模板与递归、模板与多态、类型列表与元组、模板参数包、模板与智能指针、模板与...

    解读C++编程中类模板的三种特化

    例如,可以为特定类型特化一个成员函数,使得其处理方式与其他类型不同。成员特化通常用于那些需要对特定数据类型有特殊处理逻辑的成员函数。 总结: 类模板特化是C++中提高代码复用性和灵活性的重要手段。显式...

Global site tag (gtag.js) - Google Analytics