[英]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.