[英]Can't get this pesky CRTPish syntax right
考慮以下代碼:
class A {
virtual void foo() = 0;
};
template <template <typename... Ts> class SubA, typename... Ts>
class Helper : public A {
static void bar();
virtual void foo() override final {
return bar();
}
};
template <typename T>
class NiceA : Helper<NiceA, T> { };
這編譯。 編輯:如果我現在添加:
template <>
void Helper<NiceA, int>::bar()
{
std::cout << "Hi." << std:: endl;
}
這個顯式實例編譯。 但如果我添加:
template <typename T>
void Helper<NiceA, T>::bar()
{
std::cout << "Hi." << std:: endl;
}
這失敗並出現錯誤:
a.cpp:22:28: error: invalid use of incomplete type ‘class Helper<NiceA, T>’
void Helper<NiceA, T>::bar()
^
a.cpp:10:7: error: declaration of ‘class Helper<NiceA, T>’
class Helper : public A {
^
為什么?
注意:使用 gcc 4.9.3 編譯。
首先,請注意,這與 CRTP 無關,即與從Helper
繼承的NiceA
無關。 此外,它與從A
或那個虛函數繼承的Helper
無關。
因此,這是問題的實際代碼:
template <template <typename... Ts> class SubA, typename... Ts>
class Helper
{
static void bar();
};
template <typename T>
class NiceA
{
};
template <> // This compiles fine
void Helper<NiceA, int>::bar()
{
}
template <typename T> // This does not
void Helper<NiceA, T>::bar()
{
}
int main()
{
}
只是說,因為通過提供MCVE,您可以讓那些想要給出答案的人更輕松地完成工作。
現在,為什么它不編譯? 您不能部分特化單個成員函數。 時期。
您需要部分專業化整個班級。
// Partially specialize Helper
template <typename T>
class Helper<NiceA, T>
{
static void bar();
};
// Now implement the member function
template <typename T>
void Helper<NiceA, T>::bar()
{
}
你只是錯誤地定義了你的成員函數:
template <typename T>
void Helper<NiceA, int>::bar()
{
std::cout << "Hi." << std:: endl;
}
這將是Helper<NiceA, int>
函數模板bar<T>()
的定義。 但是bar()
只是一個普通的函數,所以你不需要指定任何模板參數:
template <> // <== nothing
void Helper<NiceA, int>::bar()
{
std::cout << "Hi." << std:: endl;
}
在這種特殊情況下,Clang 的錯誤更有幫助:
main.cpp:19:1: error: template parameter list matching the non-templated nested type 'Helper<NiceA, int>' should be empty ('template<>')
template <typename T>
^ ~~~~~~~~~~~~
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.