2017-08-19 6 views
0

Warum ich für den Code untenkeine passende Funktion für den Aufruf von foo

Compiler C++ 14 Xcode 8.3.3

#include <iostream> 
#include <array> 

template<typename T, typename U> 

void foo(std::array<T,sizeof(U)> x, 
     std::array<U,sizeof(T)> y, 
     int z) 
{ 

    puts(__PRETTY_FUNCTION__); 
} 

int main() 
{ 

    foo(std::array<int,8>{},std::array<double,4>{},1); 
    foo(std::array<int,9>{},std::array<double,4>{},2); 

} 

Fehler Erste Fehler für die zweite verwendete Build-Störung erhalten rufen

foo(std::array<int,9>{},std::array<double,4>{},2); 

DEMO

g++ -std=c++1z -fconcepts -fgnu-tm -O2 -Wall -Wextra -pedantic -pthread -pedantic-errors main.cpp -lm -latomic -lstdc++fs && ./a.out 
main.cpp: In function 'int main()': 
main.cpp:18:14: error: could not convert 'std::array<int, 9>{}' from 'std::array<int, 9>' to 'std::array<int, 8>' 
    foo(std::array<int,9>{},std::array<double,4>{},2); 
       ^~~~~~~~~~~~~~ 
main.cpp: In instantiation of 'void foo(std::array<T, sizeof (U)>, std::array<U, sizeof (T)>, int) [with T = int; U = double]': 
main.cpp:17:53: required from here 
main.cpp:6:34: warning: unused parameter 'x' [-Wunused-parameter] 
void foo(std::array<T,sizeof(U)> x, 
           ^
main.cpp:7:34: warning: unused parameter 'y' [-Wunused-parameter] 
      std::array<U,sizeof(T)> y, 
           ^
main.cpp:8:14: warning: unused parameter 'z' [-Wunused-parameter] 
      int z) 
     ^

Aber wenn es eine einzige nennen, ist es funktioniert

#include <iostream> 
#include <array> 


template<typename T, typename U> 

void foo(std::array<T,sizeof(U)> x, 
     std::array<U,sizeof(T)> y, 
     int z) 
{ 

    puts(__PRETTY_FUNCTION__); 
} 


int main() 
{ 

    foo(std::array<int,8>{},std::array<double,4>{},1); 
    //foo(std::array<int,9>{},std::array<double,4>{},2); 

} 

Ausgabe

void foo(std::array<T, sizeof(U)>, std::array<U, sizeof(T)>, int) [T = int, U = double] 
Program ended with exit code: 0 
+1

Ist das Problem der zweite Anruf oder beide Anrufe? Was genau ist die Fehlermeldung und welche Version von welchem ​​Compiler auf welcher Plattform erzeugt den Fehler? Welche Kompilierungsoptionen verwenden Sie? –

+0

Der Screenshot ist kein Vorteil für die Frage, abgesehen davon, dass Sie XCode auf einem Mac verwenden. Vermeiden Sie Screenshots auf SO; Sie sind häufiger eine Ablenkung als eine Hilfe. –

+0

@ JonathanLeffler Entschuldigung dafür, ich weiß nicht, warum ich nicht die gleiche Art von fehlerhaften in xcode bekommen .. Ich habe eine Demo-Link hinzugefügt –

Antwort

4

Ihr Problem ist, auf der Zeile:

foo(std::array<int,9>{},std::array<double,4>{},2); 

Um den Fehler zu verstehen, wollen wir versuchen, den „Compiler-job“ zu tun und versuchen zu verstehen, wie die Template-Funktion foo aufgerufen wird.

So.

Die Funktion foo hat zwei Arten zu folgern: T und U.

Wenn Sie foo mit dieser Aussage nennen, sind Sie zwei Argumente übergeben:

  • std::array<int, 9>
  • std::array<double, 4>

Und Ihre Template-Funktion übernimmt:

  • std::array<T,sizeof(U)> x
  • std::array<U,sizeof(T)> y

So ist es leicht zu sehen, dass T als int und U als double abgebildet wird.

Die abgeleitete Funktion wurde:

void foo(std::array<int, 8>, 
     std::array<double, 4>, 
     int); 

Weil wahrscheinlich auf Ihre Architektur sizeof(double) = 8 und sizeof(int) = 4 (Ich habe gerade ersetzt die sizeof s).

Ihr Aufruf ist also falsch, weil Ihr erster Parameter std::array<int, 9> statt std::array<int, 8> ist.

Tat Ihre vorherige Berufung:

foo(std::array<int,8>{},std::array<double,4>{},1); 

compiliert.

2

mit GCC 7.2.0 auf einem Mac macOS Sierra 10.12.6 läuft, habe ich die Fehler erhalten (von die Quelle in der in tf71.cpp gespeichert Frage):

$ g++ -O3 -g -std=c++11 -Wall -Wextra -Werror tf71.cpp -o tf71 
tf71.cpp: In function ‘int main()’: 
tf71.cpp:18:14: error: could not convert ‘std::array<int, 9>{}’ from ‘std::array<int, 9>’ to ‘std::array<int, 8>’ 
    foo(std::array<int,9>{},std::array<double,4>{},2); 
       ^~~~~~~~~~~~~~ 
tf71.cpp: In instantiation of ‘void foo(std::array<T, sizeof (U)>, std::array<U, sizeof (T)>, int) [with T = int; U = double]’: 
tf71.cpp:17:53: required from here 
tf71.cpp:6:34: error: unused parameter ‘x’ [-Werror=unused-parameter] 
void foo(std::array<T,sizeof(U)> x, 
           ^
tf71.cpp:7:34: error: unused parameter ‘y’ [-Werror=unused-parameter] 
      std::array<U,sizeof(T)> y, 
           ^
tf71.cpp:8:14: error: unused parameter ‘z’ [-Werror=unused-parameter] 
      int z) 
      ^
cc1plus: all warnings being treated as errors 
$ 

das Problem mit dem zweiten Aufruf ist, dass die 01.234.ist nicht die Größe des double Typs in der zweiten std::array<double, 4>, so dass die Vorlage nicht übereinstimmt. Es ist eine unwahrscheinlich aussehende Template-Funktion.

Die unbenutzten Parameterfehler sind angesichts des Hauptteils der Funktion und der verwendeten Kompilierungsoptionen unvermeidlich; Sie sind tangential zum vorliegenden Problem.

+0

Ich erhalte den Fehler, wie Sie erwähnt haben, ich habe den Schnappschuss hinzugefügt –

Verwandte Themen