簡體   English   中英

部分專門化c ++中的模板類

[英]Partially specializing template class in c++

我有一個模板類:

template <typename T> struct randimpl {
    // default is to not compile, have to pass T to something to get assert
    // evaluated during second phase expansion, is_void is an arbitrary choice.
    static_assert(
        std::is_void<T>::value && false, "random() not implemented for type"
    );
};

這只是random()函數的代理,可以為用戶定義的類型重載:

// random function, proxies request through randimpl
template <typename T> T random() {
    return randimpl<T>::random();
}

我正試圖部分專門為類型_point1d<T>

// generate random instances _point1d<T>
template <typename T>
struct randimpl<_point1d<T>> {
    static _point1d<T> random() {
        return _point1d<T>(random<T>());
    }
};

據我所知,它是適當的語法,但是當我編譯時,我得到:

inc/geometry.h: In static member function ‘static _point1d<T> randimpl<_point1d<T> >::random()’:
inc/geometry.h:287:31: error: expected primary-expression before ‘(’ token
             return _point1d<T>(random<T>());
                               ^
inc/geometry.h:287:40: error: expected primary-expression before ‘>’ token
             return _point1d<T>(random<T>());
                                        ^
inc/geometry.h:287:42: error: expected primary-expression before ‘)’ token
             return _point1d<T>(random<T>());

我的語法是否關閉? 這似乎應該有效,但我不明白為什么它不接受它。

問題是static成員函數的名稱random隱藏了全局函數,它試圖調用自身(即遞歸調用)。 但它不是一個模板,與它的調用方式不符。

您可以添加:: :(范圍分辨率)來指定全局random ,例如

// generate random instances _point1d<T>
template <typename T>
struct randimpl<_point1d<T>> {
    static _point1d<T> random() {
        return _point1d<T>(::random<T>());
        //                 ^^
    }
};

生活

暫無
暫無

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

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