Ich habe meinen Kopf gegen diese für ein paar Tage, nachschlagen und auch auf der Suche nach ähnlichen Code in Open-Source-Projekte: kann nicht wirklich was ich finden mache ich falsch.Friend Vorlage Funktion innerhalb Template-Klasse verursacht verursacht undefined Symbol Link Fehler
, im Wesentlichen der Code unten (auf seine Essenz destilliert):
#include <iostream>
using std::cout;
using std::endl;
using std::string;
template <typename T>
class Node {
T value_;
public:
Node(const T& value) : value_(value) {}
T const value() const { return value_; }
friend
std::ostream& operator <<(std::ostream& out, const Node<T>& node);
Node<T> operator +(const Node<T>& other) {
return Node(value() + other.value());
}
};
template <typename T>
std::ostream& operator <<(std::ostream& out, const Node<T>& node) {
return out << node.value();
}
wenn in Code wie benutzten:
int main(int argc, char* argv[]) {
Node<string> node("node X");
cout << node << endl;
Node<int> three(3);
cout << three << endl;
return EXIT_SUCCESS;
}
bekomme ich folgende Linkerfehler:
Undefined symbols for architecture x86_64:
"operator<<(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, Node<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > const&)", referenced from:
_main in StlPractice.cpp.o
"operator<<(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, Node<int> const&)", referenced from:
_main in StlPractice.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Soweit ich feststellen kann, ist das oben genannte alles legale C++ 11 Code; Die Vorlage ist wohldefiniert, und doch scheint sie irgendwie der Fähigkeit des Linkers zu entgehen, sie zu finden.
Dieses gebaut wird mit cmake auf OS X:
cmake_minimum_required(VERSION 3.3)
project(simple_template)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(SOURCE_FILES src/simple_template.cpp)
add_executable(simple ${SOURCE_FILES})
Was soll das?
Vielen Dank im Voraus!
aktualisieren die Frage Nach habe ich lief auch die folgenden, das gleiche Resultat:
$ clang++ src/simple_template.cpp
Undefined symbols for architecture x86_64:
"operator<<(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, Node<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > const&)", referenced from:
_main in StlPractice-e20370.o
"operator<<(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, Node<int> const&)", referenced from:
_main in StlPractice-e20370.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Ja, es kompiliert und die Includes sind die "üblichen Verdächtigen" "Iostream" meist; Ich benutze cmake und füge es der Frage hinzu. Danke, für den Link, ich werde es in der Zwischenzeit überprüfen. – Marco