簡體   English   中英

將模板參數傳遞給內部結構時出錯

[英]Error when passing template parameters to inner structure

我嘗試編譯以下C ++代碼:

struct A {
    template< bool x >
    bool fun() {
        return x;
    }
};

template< typename T >
struct B {
    struct A2 {
        template< bool x >
        bool fun() {
            return x;
        }
    };

    void test() {
        A a;
        A2 a2;
        a.fun< true >();
        a2.fun< true >();
    }
};

編譯器抱怨:

source_file.cpp: In member function ‘void B<T>::test()’:
source_file.cpp:22:24: error: expected primary-expression before ‘)’ token
         a2.fun< true >();
                        ^

但是,剛好在上面的行( a.fun< true >() )可以正常編譯。 有趣的是,如果刪除行template< typename T > ,則編譯成功。 但是,由於在最小(非)工作示例中未出現該原因,因此需要該行。 怎么了

在這種情況下, A2實際上是B<T>::A2的簡寫。 由於A2是依賴於模板參數T的類型,因此您必須使用顯式template關鍵字引用其成員模板。

a2.template fun< true >();

A不是從屬類型,並且其成員模板可以使用“普通”語法來引用,而無需該額外的template關鍵字。

參見14.2 / 4和那里的類似示例

14.2模板專長的名稱[臨時名稱]

4當成員模板專業名稱出現在之后. ->postfix-expression中,或者在qualified-id中嵌套名稱說明符之后,並且postfix-expression的對象表達式取決於類型,或者qualified-id中nested-name-specifier引用一個依賴類型,但名稱不是當前實例(14.6.2.1)的成員,成員模板名稱必須以關鍵字template為前綴。 否則,假定該名稱命名為非模板。 [示例:

 struct X { template<std::size_t> X* alloc(); template<std::size_t> static X* adjust(); }; template<class T> void f(T* p) { T* p1 = p->alloc<200>(); // ill-formed: < means less than T* p2 = p->template alloc<200>(); // OK: < starts template argument list T::adjust<100>(); // ill-formed: < means less than T::template adjust<100>(); // OK: < starts template argument list } 

—末例]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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