W skrócie: w pliku nagłówkowym zabrakło deklaracji specjalizacji
szablonu. Kod wygląda tak:
::::::::::::::
templ.h
::::::::::::::
#ifndef TEMPL_H__
#define TEMPL_H__
#include <iostream>
template<typename T> void foo(const T& x) {
std::cout << "template<typename T> void foo(const T& x)\n";
}
// tu zabrakło:
// template<> void foo(const std::string& s);
#endif
::::::::::::::
templ.cc
::::::::::::::
#include "templ.h"
template<> void foo(const std::string& s) {
std::cout << "template<> void foo(const std::string& s)\n";
}
::::::::::::::
main.cc
::::::::::::::
#include "templ.h"
int main() {
foo(1);
foo(std::string("abc"));
}
::::::::::::::
VC przy linkowaniu daje błąd: "one or more multiply defined symbols
found".
g++ niestety zawiódł - kompilując z opcjami -pedantic -Wall wszystko
przeszło bez zająknięcia. Wynik:
---
template<typename T> void foo(const T& x)
template<> void foo(const std::string& s)
---
Po dodaniu opcji -O3 wynik się "nieco zmienił:
---
template<typename T> void foo(const T& x)
template<typename T> void foo(const T& x)
---
Pytanie - czy jakoś można zmusić g++, żeby reagował na takie
przypadki co najmniej ostrzeżeniem? Szukam właśnie po opcjach, ale na
razie nie mam pomysłu...
--
Paweł Kierski
ne...@pkierski.net
Pewnym sposobem jest po prostu unikanie specjalizacji szablonów na
rzecz przeciążania. Wtedy przynajmniej bez optymalizacji też "nie
działa", tzn. używa ogólnej wersji z szablonu, bo nie widzi deklaracji
przeciążonej funkcji. Ale to jednak półśrodek...
--
Paweł Kierski
ne...@pkierski.net
To się akurat sprawdzi w moim przypadku - ogólna wersja służy do
dodawania zawartości binarnej do bufora. Czyli ogólna jest dla PODów,
a specjalizacje dla nie-PODów. Gorzej, jeśli ktoś będzie chciał mieć
specjalizację dla jakiegoś PODa - też się natnie.
--
Paweł Kierski
ne...@pkierski.net
Sprawdziłem i u mnie g++ w wersji 4.4.0, kończy kompilację błędem:
"multiple definition of `void foo<std::string>(std::string const&)'"
Pozdrawiam,
- Bastek -
Ja też nie dopisałem a pewnie to ważne - kompilacja bez optymalizacji.
Pozdrawiam,
- Bastek -