Ho battuto la testa contro questo per un paio di giorni, cercandolo e anche cercando codice simile in progetti open source: non riesco davvero a trovare ciò che sto scorrettamente.Funzione modello amico dichiarata all'interno della classe modello che causa un errore di collegamento simbolico non definito
Essenzialmente, dato il codice di seguito (ricavato dalla sua essenza):
#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();
}
quando utilizzato nel codice come questo:
int main(int argc, char* argv[]) {
Node<string> node("node X");
cout << node << endl;
Node<int> three(3);
cout << three << endl;
return EXIT_SUCCESS;
}
ottengo il seguente errore di linker:
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)
Per quanto posso dire, quanto sopra è tutto il codice C++ 11 legale; il modello è ben definito, eppure, sembra in qualche modo sfuggire alla capacità del linker di trovarlo.
Questa è costruito usando CMake su 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})
Che cosa dà?
Grazie in anticipo!
Aggiornamento In seguito alla domanda, ho anche eseguito il seguente, stesso risultato:
$ 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)
Sì, compila e gli include sono i "soliti sospetti" 'iostream' principalmente; Sto usando cmake - aggiungendolo alla domanda. Grazie, per il collegamento, lo controllerò nel frattempo. – Marco