- 浏览: 267831 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (156)
- Qt (21)
- C++ (10)
- javascript (8)
- linux (8)
- RTC (1)
- JNI (1)
- Qt 图形 (1)
- Mac Bootcamp (1)
- node.js (3)
- Windows SDK 7.1 (1)
- VS2010 (2)
- linux Tcl 脚本语言 (0)
- Mac (1)
- Clucene VS2013 (1)
- VisualStudio (1)
- golang (12)
- postgresql (5)
- SVN (1)
- VS (2)
- 微信开发 (8)
- html5 (1)
- Win7 (1)
- Office (1)
- redis (1)
- Bootstrap (1)
- nginx (2)
- docker (1)
- xorm (3)
- blender (2)
- linux ec2 (1)
- aws (1)
- 七牛云 (1)
- css (5)
- h2 (1)
- react (2)
- java (2)
- html (2)
- eclipse (1)
- java swing (1)
- webpack (1)
- mysql (5)
- VS2017 (1)
- 网站 (1)
- tomcat spring (1)
- Ant (2)
- sql (1)
- 其它 (1)
- Win10 (1)
- R (1)
- git (1)
- Windows (1)
- ubuntu (2)
- python (3)
- win 11 (1)
- quasar (1)
- github (1)
- protobuf (0)
- c# (1)
最新评论
程序员已经习惯于将模板类的实现放到头文件里,但是有一些特化类或特化成员函数的实现如果也随手放到头文件里,则很可能产生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");
}
如下所示:
-----------------------------------------
//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");
}
发表评论
-
运行时PyImport_ImportModule或者py::import调用失败, error_already_set
2023-03-24 20:29 345解决方案1: 拷贝python或conda目录下的DLLs和 ... -
返回满足条件的std::vector的子集
2022-01-27 16:39 414c++ 11: std::vector<float& ... -
Qt开发磁盘空间查看器
2021-09-09 10:30 0int main(int argc, char **argv ... -
error LNK2001: unresolved external symbol std::basic_ostream
2021-07-13 17:10 411std标准库都无法链接的话,说明编译运行时不一致。 最后排查是 ... -
C2504: base class undefined
2018-02-28 10:39 1094I found the compiling error &q ... -
Qt Creator配置vs2010编译器和调试器
2014-10-14 00:20 9589(本文系原创,转载请 ... -
CMD_BEGIN(...) & CMD_COMMIT()
2014-04-17 11:43 0#include <QWidget> #inclu ... -
[转载]不定参数个数的C函数
2014-04-15 13:06 0原文地址:http://gqlyxg198 ... -
用typeof和decltype为宏(macro)传递变量的类型信息
2014-04-15 11:56 0#ifdef WIN32 #define typeof dec ... -
fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt
2014-04-15 11:42 2510VC编译报这个错误,设工程的两个配置来解决该问题:一个是取消L ... -
typedef 类型的头文件声明
2014-01-22 13:10 1284结论是编译器不支持,不要浪费时间来做这个事情,老老实实地inc ... -
QGraphicsWidget的geometry和boundingRect是什么关系?
2012-12-25 17:08 1560QGraphicsWidget的boundingRect的概念 ... -
std::map由value反求key的模板函数
2012-01-10 13:43 3075在我锲而不舍的努力下,std::map由value反求key的 ...
相关推荐
#### 二、基本概念:泛型容器与数组特化 通常,泛型容器(如`std::vector`)被设计成能够存储任何类型的单个或多个对象。然而,对于那些需要处理特定类型的多个对象的情况,泛型容器可能并不够高效或灵活。例如,当...
### C++模板特化概述与详解 在C++编程语言中,模板特化是一种非常重要的机制,它允许程序员为特定类型的模板提供定制化的实现。本文将深入探讨C++中的类模板特化,尤其是针对单个模板参数的不同特化类型:特化为...
说到C++模板特化与偏特化,就不得不简要的先说说C++中的模板。我们都知道,强类型的程序设计迫使我们为逻辑结构相同而具体数据类型不同的对象编写模式一致的代码,而无法抽取其中的共性,这样显然不利于程序的扩充和...
2. **函数模板的重载与特化区别** - **函数重载**:虽然可以使用普通函数重载来达到类似的效果,但重载函数会始终存在于编译后的二进制文件中,即使未被调用。而模板特化遵循“惰性实例化”,只有在实际使用时才会...
### 模板的主版本模板类、全特化、偏特化详解 #### 一、主版本模板类 在 C++ 模板编程中,**主版本模板类** 是一个非常基础的概念。这类模板通常定义了一组通用的功能,可以通过传递不同类型的参数来实现这些功能...
本文将深入探讨类模板和函数模板的全特化与偏特化。 一、类模板全特化与偏特化 1. 全特化(Full Specialization) 全特化是指为类模板或函数模板指定一个完全特定的类型参数列表,创建一个独立的非模板类或函数。...
C++模板特化匹配规则 C++模板特化匹配规则是指在C++编程语言中,模板的特化过程中,编译器如何选择最合适的模板实例化的规则。这个规则是由C++标准所定义的,目的是为了确保编译器能够正确地选择模板实例化,以便...
内容概要:本文详细介绍了C++中的模板编程技术,包括模板函数、模板类、模板特化、类型推导、SFINAE(Substitution Failure Is Not An Error)以及模板元编程等内容。通过具体的示例代码,帮助读者理解如何编写与...
然而,有时候我们可能需要对特定类型提供优化的实现,这就是函数模板完全特化(Full Template Specialization)的作用。本文将深入探讨C++ Builder中如何实现函数模板的完全特化,并结合给出的代码示例进行解析。 ...
前言关于讲过traits萃取器的时候探讨到偏特化的概念, 而在那一篇文章也没有具体解释偏特化是什么, 怎么实现, 所以可能在第一次看得时候会很莫名其妙. 所以我
某一部门在地区专业化中的地位以及在全省的地位时采用特化系数分析。亦称区位系数或者特化指数。当LQ=1,说明该地区这一部门人口处于省平均状态;当LQ>1,说明该地区这一部门人口相对集中,处于省特化状态;当LQ,...
模板编程中如果要特化或偏特化(局部特化)一个类模板,需要特化该类模板的所有成员函数。类模板中大多数成员函数的功能可能是一模一样的,特化时我们可能只需要重新实现1、2个成员函数即可。在这种情况下,如果全部...
- 可以创建一个新的模板类,其模板参数与原模板类匹配,但增加了某种限制,使得特化仅针对特定情况生效。然而,这需要为新模板类定义所有成员函数,即使大部分函数与原模板类相同。 ```cpp template<typename T>...
主要内容包括模板的概念与优势、函数模板和类模板的声明与实例化、模板元编程、SFINAE原则、模板特化与偏特化、类型推导与auto关键字、模板与递归、模板与多态、类型列表与元组、模板参数包、模板与智能指针、模板与...
例如,可以为特定类型特化一个成员函数,使得其处理方式与其他类型不同。成员特化通常用于那些需要对特定数据类型有特殊处理逻辑的成员函数。 总结: 类模板特化是C++中提高代码复用性和灵活性的重要手段。显式...