[英]Use the template parameter type of derived as return type for function (CRTP)?
我已經重新創建了以下代碼中的問題:
template<typename T>
class A{
using type = T::type;
type someFunction(/*some parameters*/){/*code for the function*/}
//other stuff
};
template<typename T>
class B : public A<B<T>>{
typedef T type;
//other stuff
};
問題是我需要讓A具有返回類型為T::type
的函數,但是由於在A編譯時B並未完全聲明B,所以我會收到錯誤消息,錯誤地invalid use of incomplete type 'class B<int>'
當我嘗試對其進行編譯時(可以將int替換為任何其他類型)。 有什么辦法可以使它正常工作嗎?
如果將B<T>::type
的定義移至外部特征類,則可以實現:
template <typename T>
struct Traits { /* maybe some default values */ };
template<typename T>
class A{
using type = typename Traits<T>::type;
type someFunction(/*some parameters*/){/*code for the function*/}
//other stuff
};
template<typename T>
class B : public A<B<T>>{
using type = typename Traits<B<T>>::type;
};
template <typename T>
struct Traits<B<T>> {
using type = T;
};
有什么辦法可以使它正常工作嗎?
您可以使用traits類來派生類型,而不是使用:
using type = T::type;
例:
// Declare TypeSelector
template <typename T> struct TypeSelector;
template <typename T>
class A
{
using type = typename TypeSelector<T>::type;
type someFunction(/*some parameters*/){ return type {}; }
};
// Declare B.
template <typename T> class B;
// Define TypeSelector for <B<T>> first before defining B<T>
template <typename T> struct TypeSelector<B<T>>
{
using type = T;
};
template<typename T>
class B : public A<B<T>>{
using type = typename TypeSelector<T>::type;
//other stuff
};
int main()
{
// Compiles fine.
B<int> a;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.