相关疑难解决方法(0)

使用extern模板(C++ 11)

图1:功能模板

TemplHeader.h

template<typename T>
void f();
Run Code Online (Sandbox Code Playgroud)

TemplCpp.cpp

template<typename T>
void f(){
   //...
}    
//explicit instantation
template void f<T>();
Run Code Online (Sandbox Code Playgroud)

Main.cpp的

#include "TemplHeader.h"
extern template void f<T>(); //is this correct?
int main() {
    f<char>();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是正确的使用方法extern template,还是仅将此关键字用于类模板,如图2所示?

图2:类模板

TemplHeader.h

template<typename T>
class foo {
    T f();
};
Run Code Online (Sandbox Code Playgroud)

TemplCpp.cpp

template<typename T>
void foo<T>::f() {
    //...
}
//explicit instantation
template class foo<int>;
Run Code Online (Sandbox Code Playgroud)

Main.cpp的

#include "TemplHeader.h"
extern template class foo<int>();
int main() {
    foo<int> test;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我知道将所有这些放在一个头文件中是好的,但如果我们在多个文件中实例化具有相同参数的模板,那么我们会得到多个相同的定义,编译器会将它们全部删除(除了一个)以避免错误.我该怎么用 …

c++ templates extern c++11

107
推荐指数
4
解决办法
8万
查看次数

为什么显式模板实例化的位置很重要

说我声明一个模板类Aa.h

#include <iostream>

template<bool b>
class A { 
public:
  void print(std::ostream& out);
};
Run Code Online (Sandbox Code Playgroud)

并确定在打印方法a.cpp(与明确的instatiation truefalse)

#include "a.h"

template<bool b>
void A<b>::print(std::ostream& out) {
  out << "A" << b;
}

template class A<true>;
template class A<false>;
Run Code Online (Sandbox Code Playgroud)

main.cpp可以是一个主要的主要程序示例

#include "a.h"

int main() {
  A<true> a;
  a.print(std::cout);
}
Run Code Online (Sandbox Code Playgroud)

上面的小项目编译得很好.

问题:如果我将显式实例化放在print方法(in a.cpp)的定义之上,则代码不再编译,并且通常会undefined reference to A<true>::print(...)出现错误.

#include "a.h"

template class A<true>;
template class A<false>;

template<bool b>
void A<b>::print(std::ostream& out) { …
Run Code Online (Sandbox Code Playgroud)

c++ templates explicit

5
推荐指数
1
解决办法
1257
查看次数

标签 统计

c++ ×2

templates ×2

c++11 ×1

explicit ×1

extern ×1