代码之家  ›  专栏  ›  技术社区  ›  landings

可以分别使用这两个参数,但不能同时使用这两个参数

  •  3
  • landings  · 技术社区  · 7 年前

    #include<functional>
    using namespace std;
    
    template<class T>
    void UseArray(
        T (&arr)[10]) {
        arr[0] = 0;
    }
    
    template<class T>
    void UseFunction(
        function<bool(T, T)> para = [](T x, T y) { return x == y; }) {
        para(1, 2);
    }
    
    template<class T>
    void UseArrayAndFunction( 
        T (&arr)[10],       // <-- All errors are here
        function<bool(T, T)> para = [](T x, T y) { return x == y; } ) {
        arr[0] = 0;
        para(1, 2);
    }
    
    int main() {
        int arr[10];
        UseArray<int>(arr);
        UseFunction<int>();
        UseArrayAndFunction<int>(arr);
        return 0;
    }
    

    1>d:\documents\visual studio 2017\projects\cpptest3\cpptest3\main.cpp(18): error C2065: 'arr': undeclared identifier
    1>d:\documents\visual studio 2017\projects\cpptest3\cpptest3\main.cpp(18): error C2275: 'std::function<bool(T,T)>': illegal use of this type as an expression
    1>d:\documents\visual studio 2017\projects\cpptest3\cpptest3\main.cpp(12): note: see declaration of 'std::function<bool(T,T)>'
    1>d:\documents\visual studio 2017\projects\cpptest3\cpptest3\main.cpp(18): error C2146: syntax error: missing ')' before identifier 'para'
    1>d:\documents\visual studio 2017\projects\cpptest3\cpptest3\main.cpp(18): error C2143: syntax error: missing ';' before '{'
    1>d:\documents\visual studio 2017\projects\cpptest3\cpptest3\main.cpp(18): error C2143: syntax error: missing ')' before ';'
    1>d:\documents\visual studio 2017\projects\cpptest3\cpptest3\main.cpp(18): error C2447: '{': missing function header (old-style formal list?)
    1>d:\documents\visual studio 2017\projects\cpptest3\cpptest3\main.cpp(19): error C2059: syntax error: ')'
    

    你能告诉我这些错误的原因吗?

    1 回复  |  直到 7 年前
        1
  •  2
  •   StoryTeller - Unslander Monica    7 年前

    你能告诉我这些错误的原因吗?

    MSVC错误会导致这些错误。您的最后一个函数是格式良好的C++。您可以通过避免使用数组声明器来绕过此错误:

    template<class T, typename ArrT = T[10]>
    void UseArrayAndFunction( 
        ArrT &arr,       
        std::function<bool(T, T)> para = [](T x, T y) { return x == y; } ) {
        arr[0] = 0;
        para(1, 2);
    }
    

    live on Godbolt .