为什么在标题的结构中声明的模板不违反ODR和专业化呢?

时间:2017-04-10 13:13:14

标签: c++ templates one-definition-rule

我有这段代码:

#include <iostream>

struct A
{
    template<typename T> bool isImplemented()
    {
                std::cout << "Not Implemented" << std::endl;
                return false;
    }
};

template<> inline bool A::isImplemented<int>()
{
    std::cout << "int Implemented" << std::endl;
    return true;
}

我可以理解为什么模板专业化需要内联,为了防止ODR被违反,内联将合并转换表避免冲突。

但是,为什么我不需要在结构A中的isImplemented上内联? 也许这个问题可以扩展到,为什么如果方法在头部的struct / class中声明它不需要内联? 据我所知,它会在每个被调用的目标文件(.o)上创建符号,违反ODR,为什么不会发生呢?

2 个答案:

答案 0 :(得分:3)

您不需要它有两个原因:

  • 在类定义中定义的每个函数都是隐式inline
  • 模板不需要inline个关键字。请记住,您的原始功能是模板,而专业化则不是。

答案 1 :(得分:1)

要强调的是[ { "user": 1, "product": 2, "sh_price": 10, "quantity": 3, }, { another object }, ... ] def post(self, request): serializer = self.get_serializer(data=request.data, many=True, context={'request': request}) #many=True serializer.is_valid() #validate request.data serializer.save() #save every object of request.data 不是函数。 它是函数的模板,只有在专门化时才会存在(作为代码),就像使用template<typename T> bool isImplemented()一样。

这里的template<> inline bool A::isImplemented<int>()不是强制性的。没有它,程序就可以完美地编译和运行。

奇怪的是,您的inline不依赖于任何模板参数,也不依赖于struct A方法,因此我仍在尝试找出您的意图。

您的功能的简单用法可能如下所示:

isImplemented()

输出:

int  main( )
{
    A a;

    a.isImplemented< int >( );
    a.isImplemented< double >( );
}

基本上你可以告诉你从通用的那些明确实现的专业化。这是你需要的吗?

修改

鉴于对我的回答的评论,我相信原来的问题在这里得到了很好的回答: