gpt4 book ai didi

c++ - 函数模板显式实例化 extern

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:54:46 25 4
gpt4 key购买 nike

我有一个函数,它对许多基本类型具有完全相同的代码。为了节省代码行,我想声明它为模板并为所有以后使用的类型显式实例化它一次:头文件中的声明和实现+ cpp文件中的显式实例化(与编写普通功能围兜的设计相同)。

我的方法是:

// header.h
template <class T> T func (T arg);


// header.cpp
#include "header.h"

template <class T> T func (T arg)
{
// implementation...
}
template int func<int> (int arg);
template double func<double> (double arg);

然而,关于 parashift ,我找到了这种形式的声明:

// header.h
template <typename T> extern void foo();

这里的extern是什么意思?它与我的方法有何不同?什么是正确的?

此外,普通函数永远不必声明 extern .如果是extern template void foo<int>();就不一样了(参见已接受的答案 here),什么会禁止编译器实例化头文件中已经实现的模板。

编辑:

// header.h
int func (int arg);
double func (double arg);

// header.cpp
#include "header.h"

int func (int arg)
{ ... }
double func (double arg)
{ ... }

不完全类似/等同于

// header.h
template <class T> T func (T arg);
// here is the question: like above or template <class T> extern T func (T arg); ???

// header.cpp
#include "header.h"

template <class T> T func (T arg)
{ ... }
template int func<int> (int arg);
template double func<double> (double arg);

关于以后的使用

// main.cpp
#include "header.h"

int main ()
{
// for overloading
func(20);
func(20.0);
func((int)20.0);

// for template
func(20); // == func<int>(20)
func(20.0); // == func<double>(20.0)
func((int)20.0); // == func<int>((int)20.0)
func<int>(20.0); // == func<int>((int)20.0)

return 0;
}

最佳答案

您的语法在头文件中声明某处存在一个 template <class T> T func (T arg);这仍然不会让用户拥有使用该模板函数的代码,但会让模板代码这样做(如果没有看到模板函数定义,编译器将无法实例化)。

您提到的常见问题解答部分具有声明存在某个类的模板实例化的语法 X某处和编译器,当看到 X x = func(X());不应实例化模板,而应保留未解析的符号并让链接器处理它。

关于c++ - 函数模板显式实例化 extern,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21526015/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com