// problem.cpp:
#include <string>
template<typename T> void func(const T & v);
int main() {
int i;
float f;
char * cp;
char ca[4];
func(i);
func(f);
func(cp);
func(std::string("std::string"));
func(ca);
func("string_literal");
return 0;
}
// problem2.cpp
#include <string>
template<typename T> void func(const T & v);
// undefined reference to `void func<int>(int const&)'
template<> void func<int>(const int & v) { }
// undefined reference to `void func<float>(float const&)'
template<> void func<float>(const float & v) { }
// undefined reference to `void func<char*>(char* const&)'
template<> void func<char *>(char * const & v) { }
// void func<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
template<> void func<std::string>(std::string const & v) { }
// undefined reference to `void func<char [4]>(char const (&) [4])'
// ???
// undefined reference to `void func<char [15]>(char const (&) [15])'
// ???
找到的兩種解決方案:如何專門模板函數讓它接受傳遞一個char數組作爲參數?
一)在problem2.cpp:
template<> void func<char[4]>(const char (&v)[4]) { }
template<> void func<char[15]>(const char (&v)[15]) { }
二)problem.cpp:
template<typename T, unsigned N> void func(const T (&v)[N]) { func(v+0); }
and then in problem2.cpp, add the newly missing
template<> void func<const char *>(const char * const & v) { }
對不起akappa,不得不再次修改,以澄清他們是兩個獨立的解決方案...
akappa:我唯一的方法通過編輯它可以爲此問題添加一些內容。我也不能評論也不能添加答案。可能與某些事情有關»Stack Overflow需要來自另一個域的外部JavaScript,該域被阻塞或無法加載。「我不知道如何解決,因爲我不知道SO究竟是如何告訴我的。
不要專門函數模板。真的,*不要*。 – Xeo 2012-08-01 11:19:46
@akappa:足夠了 - http://www.gotw.ca/publications/mill17.htm – Xeo 2012-08-01 11:41:56
@Xeo:我沒有刪除我的評論,因爲那是我在google上通過簡單搜索獲得的第一個鏈接;) – akappa 2012-08-01 11:46:41