簡體   English   中英

如何專門化一個類模板成員函數?

[英]How to specialize a class template member function?

我有一個類模板,簡化,有點像:

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;
    }
};

另一個繼承自這個類的類:

class B : public A<double>
{
    // ...
};

但是當我這樣做時,編譯器說:

 invalid operands of types ‘double’ and ‘const double’ to binary ‘operator%’

然后,我嘗試將我的operator%專門化為doublefloat,因為對於這些類型,%似乎是不可能的。 我在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;
}

我得到這個錯誤,我實際上不明白為什么......

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;
}

或者在類定義中移動它。

這是因為與“真實”模板不同,完整功能模板專業化就像鏈接和ODR方面的普通功能一樣。 並且由於您將它專門用於任何類之外,因此它不像在類定義中定義的普通方法那樣隱式聲明內聯。

因此,您要么聲明函數內聯,要么只在標題中聲明它,並在源文件中定義它,就像任何普通函數一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM