簡體   English   中英

無法正確理解這種討厭的 CRTPish 語法

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

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