Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何专门化类模板成员函数?_C++_Templates - Fatal编程技术网

C++ 如何专门化类模板成员函数?

C++ 如何专门化类模板成员函数?,c++,templates,C++,Templates,我有一个类模板,简化后有点像: template<typename T> class A { protected: T _data; public: A* operator%(const A &a2) const { A * ptr; ptr = new A(this->_data % a2._data); return ptr; } }; 然后,我尝试将我的操作符%专门化为double

我有一个类模板,简化后有点像:

template<typename T>
class A
{
protected:
    T _data;
public:
    A* operator%(const A &a2) const
    {
        A * ptr;

        ptr = new A(this->_data % a2._data);
        return ptr;
    }
};
然后,我尝试将我的
操作符%
专门化为double和float,因为%似乎不可能用于这些类型。我在A类声明之后添加了以下代码

template<>
A* A<double>::operator%(const A &a2) const
{
    A * ptr;
    ptr = new A((uint32_t)this->_data % (uint32_t)a2._data);
    return ptr;
}
模板
A*A::运算符%(常数A和a2)常数
{
A*ptr;
ptr=新的A((uint32_t)此->_数据%(uint32_t)a2._数据);
返回ptr;
}
我得到这个错误,我真的不明白为什么

In function `A<double>::operator%(A const&) const':
./include/A.hpp:102: multiple definition of `A<float>::operator%(A const&) const'
src/Processor.o:./include/A.hpp:102: first defined here
函数“A::operator%(A const&)const”中的
:
./include/A.hpp:102:A::operator%(A const&)const的多重定义
src/Processor.o:./include/A.hpp:102:首先在此处定义

如果您在类之外实现了专门化,它将不再是内联的,因此将被多次定义。将其标记为内联:

template<>
inline A* A<double>::operator%(const A &a2) const
{
    A * ptr;
    ptr = new A(this->_data % a2._data);
    return ptr;
}
模板
内联A*A::运算符%(常量A和a2)常量
{
A*ptr;
ptr=新的A(此->_数据%a2._数据);
返回ptr;
}
或者将其移动到类定义中。

这是因为与“真实”模板不同,完整函数模板专门化在链接和ODR方面与普通函数类似。由于您在任何类之外对其进行了专门化,因此它不像在类定义中定义的普通方法那样隐式声明为内联

因此,您要么以内联方式声明函数,要么仅在头文件中声明函数,并像任何普通函数一样在源文件中定义它

In function `A<double>::operator%(A const&) const':
./include/A.hpp:102: multiple definition of `A<float>::operator%(A const&) const'
src/Processor.o:./include/A.hpp:102: first defined here
template<>
inline A* A<double>::operator%(const A &a2) const
{
    A * ptr;
    ptr = new A(this->_data % a2._data);
    return ptr;
}