2014-12-19 24 views
2
#include<iostream> 
#include<string> 
using namespace std; 

template<typename T> 
struct Node{ 
    T data; 
    Node* left; 
    Node* right; 

    Node(T x) : data(x), left(NULL), right(NULL){} 
}; 

template<typename T> 
Node<T>* new_node(T x) 
{ 
    Node<T>* return_node = new Node<T>(x); 
    return return_node; 
} 

int main() 
{ 
    Node<string>* root = new_node("hi"); //error! 

    string x = "hi"; 
    Node<string>* root2 = new_node(x); //OK 
} 

爲什麼你不能在括號內使用字符串?有沒有簡單的方法來完成相同的任務,而無需聲明字符串,然後創建節點,或者這是唯一的方法?爲什麼不能將字符串文字傳遞給使用模板參數的函數?

+3

因爲'T'被推斷爲'const char *',並且'節點'和'節點'是不同的類型 – 2014-12-19 10:01:58

+2

我認爲編譯器給出的錯誤信息可以解釋。 – starrify 2014-12-19 10:02:15

+3

如果你有C++ 14,你可以試試'「hi」s'。 – 2014-12-19 10:02:43

回答

7

T被推斷爲const char*,所以將返回Node<const char*>*,但你不能把它分配給Node<string>*

您可以創建一個臨時的:

new_node(std::string("hi")); 

或者你可以撥打new_node有明確的資質:

new_node<std::string>("hi"); 
2

爲什麼不能將字符串文字傳遞給使用模板參數的函數?

你可以,你沒有正確讀取編譯器錯誤信息。

這種精細編譯:

new_node("hi"); 

但這並不:

Node<string>* root = new_node("hi"); //error! 

所以,問題顯然不是傳遞字符串文字到模板的功能。

相關問題