【问题标题】:C++ Specializing single member functionC ++专门化单个成员函数
【发布时间】:2020-11-14 00:20:10
【问题描述】:

类模板成员特化的问题。

我有一个简单的类,我想专门化一个成员函数。我是这样做的:

template <class T>
class Object
{
public:
    Object() {}

    void print() const
    {
        std::cout << "It's the template" << std::endl;
    }
    // ...
};

template<>
void Object<int>::print() const
{
    std::cout << "It's an int" << std::endl;
}

对于成员函数的多重定义会导致编译错误。

如果只有一个源文件包含标题,一切都很好。

如果两个文件包含标题,我会收到以下错误:

/home/marc/QtProjects/QtAsp-Service/build-aspservice-Desktop_Qt_5_15_0_GCC_64bit-Debug/../src/Asp/aspobject.h:34: Fehler: 'Asp2::print()'的多重定义; main.o:/home/marc/QtProjects/QtAsp-Service/build-aspservice-Desktop_Qt_5_15_0_GCC_64bit-Debug/../src/Asp/aspobject.h:34:这里首先定义

这在一般情况下可能吗?如果是,有什么问题。

【问题讨论】:

  • 请编辑您的问题并添加来自您的编译器的确切错误消息。
  • 不幸的是,目前不可能只专门化模板类的成员函数;你需要专攻整个班级。有关该问题的讨论,请参阅 here
  • 你的专业有错别字,应该是AspObject,还是Objectthis 是您正在寻找的行为吗?
  • @NathanPierson 我认为有可能,有问题的函数不是模板函数,所以这个问题不太一样。您绝对可以专门化模板类的特定成员函数。
  • 哦,有趣!感谢您的更正,@FantasticMrFox

标签: c++ templates template-specialization


【解决方案1】:

您的方式是正确的,但完全专业化的成员不再是模板,因此不再隐式内联。

如果您将定义保留在标题中,或者拆分声明(在标题中)和定义(在 cpp 中),则必须添加 inline

template<>
inline void Object<int>::print()
{
    std::cout << "It's an int" << std::endl;
}

【讨论】:

    【解决方案2】:

    问题在于模板类是在单独的头文件中定义的。如果只有一个源文件包含标题,它就可以工作。如果两个或多个源文件包含标头 GCC 会引发多重定义错误。还有其他方法吗?

    【讨论】:

    • 你不应该在回答中提问。答案部分是针对问题的解决方案。
    • 对不起,不会再做了。
    • 您可能需要编辑您的问题以添加其他信息。为了修复代码,它目前与ObjectAspObject 混淆
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多