template<typename T, int P>
T matematika(T polje[], int N) {
//CODE...
}
这是错误的地方(没有函数模板的实例&#34; matematika&#34;匹配指定的类型)
template<>
string matematika(string polje[], int N) { // ERROR
//CODE...
}
答案 0 :(得分:2)
专门化模板的常规语法要求您在专业化声明中的名称后面提供专门化的模板参数。例如:
template <class T>
void foo(T t) {}
// One valid way to specialise:
template <>
void foo<int>(int i) {}
// Another valid way to specialise:
template <>
void foo(int i) {}
当专门化一个函数模板(并且只是一个函数模板)时,如果它们可以从特化中推导出来,则可以省略这些参数。就是这种情况,例如这里:
P
但是,这仅适用于可以从专业化推断出模板参数的情况。在您的情况下,情况并非如此,因为没有任何内容可以推断template<>
string matematika<string, /*Whatever value of P you want to specialise for*/>(string polje[], int N) {
//CODE...
}
。因此,您必须明确提供该值:
super
答案 1 :(得分:1)
我怀疑你想在编译时传递一个已知大小的数组,而不是重载字符串函数?
#include <iostream>
using namespace std;
template<typename T, int N>
T matematika(T (&polje)[N])
{
cout << "array version: " << polje << endl;
return polje[0];
}
std::string::value_type matematika(std::string const& polje)
{
cout << "string version: " << polje << endl;
return polje[0];
}
int main() {
// your code goes here
cout << "got: " << matematika("test") << endl;
cout << "got: " << matematika(string("string")) << endl;
return 0;
}
答案 2 :(得分:-1)
由于您使用int P
作为第二个模板参数,因此您仍需保留它:
template<typename T, int P>
T matematika(T polje[], int N) { // (1)
...
}
template<int P> // T = string
string matematika(string polje[], int N) { // (2)
...
}
然后你可以使用这些:
int matematika<int, 111>(int*, int); // (1)
string matematika<22>(string*, int); // (2)
注意,(2)是新模板功能,与(1)无关。
如果您想要专业化(1):
template<> // T = string, int P = 10
string matematika<string, 10>(string polje[], int N) { // (3)
...
}
然后你可以使用这个:
string matematika<string, 10>(string*, int); // (3)
string matematika<string, 11>(string*, int); // (1)
但是,您的问题根本不清楚为什么您需要原始模板中的int P
。也许这意味着要用作数组大小。像这样:
templattemplate<typename T, int P>
T matematika(T (&polje)[P])