63317


下記のコードで1.の方はコンパイルが通りますが、2.の方はコンパイルエラーとなります。  
普通に考えれば推論可能な気がしますが、これはコンパイラのバグでしょうか？

それともそもそもインナークラスとアウタークラスのパラメータパックに関しては推論が働かないのでしょうか？

OSはWindows、コンパイラはMSVCを利用しています。

**エラーメッセージ**

[code]

    テンプレートパラメータ'U'はテンプレートパラメータパックの後に続いており
    'func'の関数パラメータから推測できないため、使用できません
    
[/code]

**ソースコード**

[code]

    #include <type_traits>
    
    // 1.複数可変長templateパラメータ関数の推論
    
    template<typename... T> class Class {
    };
    
    template<typename... T1, typename... T2> 
    void func(const Class<T1...>&, const Class<T2...>&) {
    }
    
    // 2.インナークラスを伴う複数可変長templateパラメータ関数の推論
    
    template<typename... T> class Outer {
    public:
        template<typename... U> class Inner {
        };
    };
    
    template<typename... T, typename... U> 
    void func(const typename Outer<T...>::template Inner<U...>&) {  // error!
    }
    
    int main() {
    
        // 1.
        Class<int, int> a, b;
        func(a, b);
    
        // 2.
        Outer<int, int>::Inner<int, int> c;
        func(c);    // error!
    
        return 0;
    }
    
    
[/code]


CC BY-SA 4.0
2020-02-24T05:12:43.410
63315
2020-02-24T06:17:24.110
2020-02-24T05:44:19.470
3060
37855
question
c++
複数のテンプレートパラメータパックを持つ関数の推論に関して


パラメーターパックは関係なくて、`Outer::Inner`を分割して推論できません。

[code]

    #include <type_traits>
    
    class Outer {
    public:
        class Inner {
        };
    };
    
    template<typename OUTER, typename INNER> 
    void func(const typename OUTER::INNER&) {
    }
    
    int main() {
        Outer::Inner c;
        func(c);    // error!
        return 0;
    }
    
[/code]


CC BY-SA 4.0
2020-02-24T06:17:24.110
63317
2020-02-24T06:17:24.110
4236
63315
answer