2011-11-03 61 views
2

我想根据用户输入的内容创建一个整数,双精度或字符串数​​组。程序询问用户有多少个对象在数组中,然后询问对象。完成后,用户可以搜索一个对象。动态创建数组 - 无法推断出'T'的模板参数 - C++

请帮助解决这个错误:

1>------ Build started: Project: Test, Configuration: Debug Win32 ------ 
1>Build started 11/3/2011 4:06:12 PM. 
1>InitializeBuildStatus: 
1> Touching "Debug\Test.unsuccessfulbuild". 
1>ClCompile: 
1> main.cpp 
1>m:\cs172\other\test\main.cpp(10): error C2783: 'void linearSearchProg(void)' : could not deduce template argument for 'T' 
1>   m:\cs172\other\test\main.cpp(7) : see declaration of 'linearSearchProg' 
1> 
1>Build FAILED. 
1> 
1>Time Elapsed 00:00:02.97 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

谢谢!

这是我的代码:

#include <iostream> 
#include <iomanip> 
#include <string> 
#include <vector> 
using namespace std; 

template<typename T> void linearSearchProg(); 

int main() { 
    linearSearchProg(); 
    return 0; 
} 


template<typename T> T* createArray(); 
template<typename T> T linearSearch(const T list[], T key, int arraySize); 

template<typename T> void linearSearchProg() { 
    cout << "Generic Linear Search" << endl; 
    //int *list = createArray(); 
    T *list = createArray(); 

    // Get Value to Search For 
    cout << "What would you like to search for? "; 
    cin.ignore(); 
    int key; 
    cin >> key; 

    // Search for Value 
    int index = linearSearch(list, key, (sizeof list)/(sizeof list[0])); 
    cout << "Object " << key << " was found at index " << index << "(Number " << index+1 << ")" << endl; 
} 

// int* createArray() { 
template<typename T> T* createArray() { 
    int size; 
    cout << "How many objects to you have to input? "; 
    cin >> size; 
    cout << "Please input objects of the same type." << endl; 
    // int *list = new int[size]; 
    T *list = new T[size]; 
    for (int i = 0; i < size; i++) { 
     cin.ignore(); 
     cout << "? "; 
     getline(cin, list[i]); 
    } 
    cout << "Your array is as follows: "; 
    for (int i = 0; i < size; i++) { 
     cout << list[i] << " "; 
    } 
    cout << endl; 
    return list; 
} 

// int linearSearch(const int list[], int key, int arraySize) { 
template<typename T> T linearSearch(const T list[], T key, int arraySize) { 
    for (int i = 0; i < arraySize; i++) { 
     if (key == list[i]) 
      return i; 
    } 
    return -1; 
} 

修改:

linearSearchProg<int>(); 
T *list = createArray<T>(); 
T key; 
int index = linearSearch<T>(list, key, (sizeof list)/(sizeof list[0])); 

得到这个错误现在:

1>m:\cs172\other\test\main.cpp(52): warning C4244: 'initializing' : conversion from 'double' to 'int', possible loss of data 
1>   m:\cs172\other\test\main.cpp(25) : see reference to function template instantiation 'void linearSearchProg<double>(void)' being compiled 
1>m:\cs172\other\test\main.cpp(52): error C2440: 'initializing' : cannot convert from 'std::string' to 'int' 
1>   No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called 
1>   m:\cs172\other\test\main.cpp(28) : see reference to function template instantiation 'void linearSearchProg<std::string>(void)' being compiled 

回答

4

模板函数尝试从传入参数的类型推导出模板类型。

显然,如果函数没有参数,函数不能做到这一点。 在这种情况下,你必须明确地调用函数时注明的模板类型:

所以,在你的主要功能:

int main() { 
    linearSearchProg<double>(); 

你也需要做这里面linearSearchProg

template<typename T> void linearSearchProg() { 
    cout << "Generic Linear Search" << endl; 
    //int *list = createArray(); 
    T *list = createArray<T>(); 
+0

非常感谢,我只是希望能解决最后一个错误,并在我的问题中更新。 – michaellindahl

3
template<typename T> void linearSearchProg(); 

linearSearchProg需要一个模板参数,不能推断从func (因为它没有)。在main()更进一步尝试调用它不提供模板参数:

linearSearchProg(); 

它实际上应该是这样的,比如:

linearSearchProg<double>(); 

对于您要实现特定的逻辑,我认为linearSearchProg不需要模板参数。您需要知道您愿意支持的所有类型,并以某种方式切换用户输入以使用适当的模板参数调用模板函数。

+0

我不知道它会有什么类型,因为这在运行时是由用户决定的。我想这是不可能的,我会重写我的代码,询问用户他们会给我什么样的输入。 – michaellindahl

+0

@michaellindahl:模板是编译时的东西,所以这就是你所能得到的。您无法在运行时实例化模板。 –

+0

好的,谢谢你的快速回复! – michaellindahl