(おそらく)簡単な質問があります。テンプレートで使用される関数をいつ宣言する必要がありますか?次のコードが出力されます(gcc> = 4.1を使用)。
私のAオブジェクトを初期化する
初期化なし
gcc 4.0を使用すると、次のコードが出力されます。
私のAオブジェクトを初期化する
文字列オブジェクトを初期化する
#include <iostream>
#include <string>
template<typename T>
void init(T& t){
std::cout << "no init" << std::endl;
}
// void init(std::string& t);
template <typename T>
void doSomething(T& t){
init(t);
// do some further stuff
}
void init(std::string& t){
std::cout << "init my string object" << std::endl;
}
class A{
};
void init(A& t){
std::cout << "init my A object" << std::endl;
}
int main(){
A a;
doSomething(a);
std::string s("test");
doSomething(s);
return 0;
}
std :: stringとAの使用法の違いは何ですか?同じ振る舞いがあるべきではありませんか?
追加の前方宣言を使用すると正常に機能しますが、いつ必要になりますか?
乾杯、CSpille