jgdo schrieb:
> Wenn ich z.B.
> nur foo(double) definiert habe, es aber mit einem int aufrufe, würde der
> Compiler implizit den int nach double konvertieren und foo(double)
> aufrufen. Ich will jedoch, dass in diesem Fall das Programm nicht
> kompiliert, weil kein foo(int) definiert wurde.
Hierfür könntest die Funktion ohne Funktionsrump deklarieren.
1 | #include <iostream>
|
2 |
|
3 | void func(int);
|
4 | void func(double i) {
|
5 | std::cout << i;
|
6 | }
|
7 |
|
8 | int main(void) {
|
9 | func(5);
|
10 | return 0;
|
11 | }
|
Der Kompiliervorgang scheitert an einem Linkererror:
g++ undefFunc.cpp -o undefined
/tmp/ccDqcvMI.o: In function `main':
undefFunc.cpp:(.text+0x30): undefined reference to `func(int)'
collect2: error: ld returned 1 exit status
Edit:
Ralf G. schrieb:
> Da musst du aber für jeden Typ eine Funktion schreiben. Das will man
> sich mit Templates ja sparen.
Funktionstemplates lassen sich aber nicht spezialisieren.
Mit C++11 geht es sogar noch eleganter mit einem echten Compiler-Fehler:
1 | void func(double i) {
|
2 | std::cout << i;
|
3 | }
|
4 |
|
5 | template<typename T>
|
6 | void func(T) = delete;
|
g++ undefFunc.cpp -std=c++11 -o undefined
undefFunc.cpp: In function ‘int main()’:
undefFunc.cpp:11:11: error: use of deleted function ‘void func(T) [with
T = int]’
func(5);
^
undefFunc.cpp:8:6: error: declared here
void func(T) = delete;
^
Fabian