如何专门化非模板类的模板化成员函数?

发布于 2024-09-09 12:26:13 字数 662 浏览 5 评论 0原文

假设我有一个文件 alpha.h:

class Alpha {
public:
    template<typename T> void foo();
};

template<> void Alpha::foo<int>() {}
template<> void Alpha::foo<float>() {}

如果我在多个 cpp 文件中包含 alpha.h 并使用 GCC 4.4 进行编译,它会抱怨 foofoo< 有多个定义;float> 跨多个对象文件。对我来说很有意义,所以我将最后两行更改为:

template<> extern void Alpha::foo<int>() {}
template<> extern void Alpha::foo<float>() {}

但是 GCC 说:

显式模板专业化 不能有存储类别

好吧...那么我应该如何正确地做到这一点?我担心 C++ 不允许我首先尝试做的事情,在这种情况下是否有一个好的习惯用法可以完成同样的事情?

suppose I have a file alpha.h:

class Alpha {
public:
    template<typename T> void foo();
};

template<> void Alpha::foo<int>() {}
template<> void Alpha::foo<float>() {}

If I include alpha.h in more than one cpp file and compile with GCC 4.4, it complains there are multiple definitions of foo<int> and foo<float> across multiple object files. Makes sense to me, so I change the last two lines to:

template<> extern void Alpha::foo<int>() {}
template<> extern void Alpha::foo<float>() {}

But then GCC says:

explicit template specialization
cannot have a storage class

ok... so how am I supposed to do this correctly? I'm worried that C++ doesn't allow what I'm trying to do in the first place, in which case is there a good idiom that will accomplish the same thing?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

寂寞美少年 2024-09-16 12:26:18

不需要单独的声明或内联键工作。 PF低于工作代码。

#include<iostream>

class temp
{
public:
    template <class T>
    T add1(T a, T b)
    {
            return (a + b);
    }
};

template<>
std::string temp::add1<std::string>(std::string aa, std::string bb)
{
    return aa+bb;
}

int main()
{
    temp *tc = new temp();
    std::cout << tc->add1<float>(5.7, 4.5) << std::endl;
    std::cout << tc->add1<std::string>("my ","program") << std::endl;
}

输出是:

10.2

我的程序

No separate declaration or inline keywork is required. PF below working code.

#include<iostream>

class temp
{
public:
    template <class T>
    T add1(T a, T b)
    {
            return (a + b);
    }
};

template<>
std::string temp::add1<std::string>(std::string aa, std::string bb)
{
    return aa+bb;
}

int main()
{
    temp *tc = new temp();
    std::cout << tc->add1<float>(5.7, 4.5) << std::endl;
    std::cout << tc->add1<std::string>("my ","program") << std::endl;
}

output is :

10.2

my program

拥抱没勇气 2024-09-16 12:26:17

您可以转发声明以及内联选项:

// .h
template<> void Alpha::foo<int>();

//.cpp
template<> void Alpha::foo<int>() {}

You can forward declare as well as the inline option:

// .h
template<> void Alpha::foo<int>();

//.cpp
template<> void Alpha::foo<int>() {}
回首观望 2024-09-16 12:26:17

从 ODR 的角度来看,完全(显式)专用的模板不再是模板,因此它与同类非模板实体遵循相同的 ODR 原则。 (我相信该规则有一些例外,但对于我们的目的来说已经足够了)。

在您的情况下,出于 ODR 目的,完全专用的函数模板是一个普通函数。因此,作为一个普通函数,它应该在头文件中声明并在一个且唯一的一个实现文件中定义

From the ODR point of view, a fully (explicitly) specialized template is no longer a template, so it is subject to the same ODR principles as a non-template entity of the same kind. (There are some exceptions from that rule, I believe, but it is good enough for our purposes).

In your case, for ODR purposes a fully specialized function template is an ordinary function. So, as an ordinary function it should be declared in the header file and defined in one and only one implementation file.

两个我 2024-09-16 12:26:16

或者使用 inline 关键字

template<> inline void Alpha::foo<int>() {}

,在单独的 cpp 文件中提供实现

use inline keyword

template<> inline void Alpha::foo<int>() {}

alternatively, provide implementation in separate cpp file

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文