我正在嘗試從派生類模板中專門化一個基類方法,但我不確定實作它的正確語法是什么。
出于實作的原因,我需要一個類似于下面的類結構,但需要func()從頂級類專門化:
template < typename T >
class BaseTemplate {
public:
BaseTemplate() = default;
virtual ~BaseTemplate() = default;
virtual void func() {
std::cout << __func__ << std::endl;
}
};
class DerivedBase : public BaseTemplate< float > {
public:
DerivedBase() : BaseTemplate() { /* ... */}
virtual ~DerivedBase() = default;
};
template < typename U >
class DerivedTemplate : public DerivedBase {
public:
DerivedTemplate() : DerivedBase() { /* ... */ }
~DerivedTemplate() = default;
protected:
U _member;
};
template < >
void DerivedTemplate< int >::func() {
std::cout << __func__ << " [int]" << std::endl; // error: no member function ‘func’ declared in ‘DerivedTemplate<int>’
}
此外,顯式宣告using DerivedBase::func;in 會DerivedTemplate導致另一個錯誤:
error: template-id ‘func<>’ for ‘void DerivedTemplate<int>::func()’ does not match any template declaration
uj5u.com熱心網友回復:
在您的情況下,無需專門化基類函式。由于功能func()是虛擬的,你可以只實作它在派生類中的一個(無論是在DerivedTemplate或DerivedBase或兩者如果需要的話):
template < typename U >
class DerivedTemplate : public DerivedBase {
public:
DerivedTemplate() : DerivedBase() { /* ... */ }
~DerivedTemplate() = default;
virtual void func() override {
std::cout << __func__ << "(DerivedTemplate version)" << std::endl;
}
protected:
U _member;
};
uj5u.com熱心網友回復:
另外,明確宣告使用 DerivedBase::func; 在 DerivedTemplate 中導致另一個錯誤:error: template-id 'func<>' for 'void DerivedTemplate::func()' does not match any template declaration
DerivedBase::func;方法已定義但未宣告。您需要添加void func();在DerivedTemplate。
[演示]
#include <iostream> // cout
template <typename T>
class BaseTemplate {
public:
BaseTemplate() = default;
virtual ~BaseTemplate() = default;
virtual void func() {
std::cout << __func__ << " [BaseTemplate]\n";
}
};
class DerivedBase : public BaseTemplate<float> {
public:
DerivedBase() : BaseTemplate<float>{} {}
virtual ~DerivedBase() = default;
};
template <typename U>
class DerivedTemplate : public DerivedBase {
public:
DerivedTemplate() : DerivedBase{} {}
~DerivedTemplate() = default;
void func();
};
template <>
void DerivedTemplate<int>::func() {
std::cout << __func__ << " [DerivedTemplate<int>]\n";
}
int main() {
BaseTemplate<char> bt{}; bt.func();
DerivedTemplate<int> dti{}; dti.func();
}
// Outputs:
//
// func [BaseTemplate]
// func [DerivedTemplate<int>]
您在示例中可以做的是BaseTemplate::func從DerivedTemplate<int>.
[演示]
#include <iostream> // cout
template <typename T>
class BaseTemplate {
public:
BaseTemplate() = default;
virtual ~BaseTemplate() = default;
virtual void func() {
std::cout << __func__ << " [BaseTemplate]";
}
};
class DerivedBase : public BaseTemplate<float> {
public:
DerivedBase() : BaseTemplate<float>{} {}
virtual ~DerivedBase() = default;
};
template <typename U>
class DerivedTemplate : public DerivedBase {
public:
DerivedTemplate() : DerivedBase{} {}
~DerivedTemplate() = default;
void func();
};
template <>
void DerivedTemplate<int>::func() {
BaseTemplate::func();
std::cout << " [int]";
}
int main() {
DerivedTemplate<int> dti{}; dti.func();
}
// Outputs:
//
// func [BaseTemplate] [int]
此外,如果您計劃在此層次結構中使用運行時多型性,您將希望virtual void func() override在某些類中使用。
[演示]
#include <iostream> // cout
#include <memory> // make_unique, unique_ptr
template <typename T>
class BaseTemplate {
public:
BaseTemplate() = default;
virtual ~BaseTemplate() = default;
virtual void func() {
std::cout << __func__ << " [BaseTemplate]\n";
}
};
class DerivedBase : public BaseTemplate<float> {
public:
DerivedBase() : BaseTemplate<float>{} {}
virtual ~DerivedBase() = default;
virtual void func() override {
std::cout << __func__ << " [DerivedBase]\n";
}
};
template <typename U>
class DerivedTemplate : public DerivedBase {
public:
DerivedTemplate() : DerivedBase{} {}
~DerivedTemplate() = default;
virtual void func() override {
std::cout << __func__ << " [DerivedTemplate]\n";
}
};
template <>
void DerivedTemplate<int>::func() {
std::cout << __func__ << " [DerivedTemplate<int>]\n";
}
int main()
{
std::unique_ptr<BaseTemplate<float>> dti_up{std::make_unique<DerivedTemplate<int>>()};
dti_up->func();
}
// Outputs:
//
// func [DerivedTemplate<int>]
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/407832.html
標籤:
