Хорошо, чтобы использовать эти два параметра каждый независимо, но не иметь оба - PullRequest
0 голосов
/ 11 декабря 2018

Я использую сообщество msvc 2017.Когда я тестирую следующий код:

#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;
}

Первые две функции в порядке, но последняя имеет следующие ошибки (все находятся в 18-й строке):

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 Ответ

0 голосов
/ 11 декабря 2018

Не могли бы вы сказать мне, что вызывает эти ошибки?

Ошибка 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);
}

, который прекрасно работает на MSVC 19.10 (VS 2017).Посмотри живи на Годболте .

...