gpt4 book ai didi

c++ - 模板函数特化的单独声明和定义 : different behaviour for member and nonmember functions

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

我想为函数模板声明特化,但稍后在源文件中定义它。考虑下一个例子:

.hpp

// approach #1
template <typename T> const char *GetTypeName();
template <> const char *GetTypeName<int>();

// approach #2
template <typename T> class TypeName {static const char *Get();};
template <> const char *TypeName<int>::Get();

.cpp

// approach #1
template <> const char *GetTypeName<int>()
{
return "int"
}

// approach #2
template <> const char *TypeName<int>::Get()
{
return "int"
}

在 MSVC 2012 中( 安装 CTP),两种变体都可以正常编译,但非成员变体 (#1) 会引发链接器错误( Unresolved external 问题,诸如此类)。这是正常行为吗? MSVC 特定?编译器错误?在 CTP 中固定?

编辑
我只使用专门的版本。它们在标题中声明并在源代码中定义。此方法适用于成员,但不适用于独立函数。

编辑 2
嗯......我正在尝试在家里构建相同的快照(相同的 MSVC 安装,没有 CTP),并且它链接没有问题。似乎是本地错误或损坏的安装。

最佳答案

函数模板不是函数。一个完全专用的函数模板一个函数。

由于必须定义所有(odr 使用的)函数,因此您必须有办法为任意模板实例化生成定义。因此主函数模板的定义必须在头部。

header.h:

template <typename T>            //  this
const char * GetTypeName() // is
{ // not
return "foo"; // a
} // function

template <>
const char * GetTypeName<int>();

impl.cpp:

#include "header.h"

template <>
const char * GetTypeName<int>()
{
return "int";
}

关于c++ - 模板函数特化的单独声明和定义 : different behaviour for member and nonmember functions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16203261/

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