【问题标题】:OK to use these two parameters each independently, but fail to have both可以单独使用这两个参数,但不能同时使用这两个参数
【发布时间】:2018-12-11 07:09:54
【问题描述】:

我使用 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: ')'

你能告诉我是什么导致了这些错误吗?

【问题讨论】:

  • 代码对我来说看起来不错。它适用于 g++ 7.3.0,使用 -std=c++11-std=c++14

标签: c++ visual-studio visual-c++ visual-studio-2017


【解决方案1】:

你能告诉我是什么导致了这些错误吗?

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) 上构建良好。见live on Godbolt

【讨论】:

  • 非常感谢。我从没想过我会遇到编译器错误。
  • @landings - 遗憾的是,它们很常见(有时非常奇怪)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多