2015-10-04 126 views
0

我有一個模板類,當我在主實例化時沒有任何問題,但是當我嘗試在另一個類中實例化相同的問題時。可有人請賜教我對此的解決方案在C++中的另一個類中的模板類實例化

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

template <class T> 
class property { 
public: 
    property(string name) 
    { 
     propertyName= name; 
    } 
private: 
    T item; 
    string propertyName; 
}; 
main() 
{ 
    property<int> myIntProperty("myIntProperty"); 
} 

上述代碼編譯出來沒有任何問題。 但是

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

template <class T> 
class property { 
public: 
    property(string name) 
    { 
     propertyName= name; 
    } 
private: 
    T item; 
    string propertyName; 
}; 

class propertyHolder 
{ 
    property<int> myIntProperty("myIntProperty"); 
}; 

這段代碼沒有被編譯。 給我錯誤像

main.cpp | 19 |錯誤:字符串常量之前的預期標識符| main.cpp | 19 |錯誤:期望','或'...'在字符串常量之前|

感謝, 哈里什

+0

您正在使用哪些C++書籍而不閱讀? –

+0

'main'總是需要'int'的返回類型。 –

回答

0

您想在類propertyHandler中宣佈字段。該語法不起作用,因爲您無法聲明字段並在相同位置賦值。

可以delcare它,並在構造函數初始化:

property<int> myIntProperty; 

propertyHolder(): myIntProperty("name") {} 

或C++語法11:

property<int> myIntProperty{"name"}; 

或聲明爲靜態,並且他們宣稱這樣的:

static property<int> myIntProperty; 

和後級聲明:

property<int> propertyHolder::myIntProperty("name"); 
+0

*「該語法不起作用,因爲您無法在相同位置聲明字段並將其賦值。」*您無法在初始化之前分配,是的。但正如你自己的答案所示,C++ 11允許在類聲明中進行初始化(即使你錯誤地稱其爲「assign」)。 –

+0

@ChristianHackl我的話可能有點不正確,但據我所知,我展示了正確的代碼。我正在盡我所能。如果你能告訴我正確的動作名稱,我可以用他們來編輯我的答案,因爲我學習的不是英文術語的C++。 –

+0

你的代碼當然是正確的。但是你通常應該嘗試在賦值和初始化之間多加區分。他們是不同的東西。 –

2
property<int> myIntProperty("myIntProperty"); 

這是一個函數聲明,所以希望你識別它,就像string s = "myIntProperty"後插入默認參數。

也許你想初始化稱爲myIntProperty對象,

property<int> myIntProperty {"myIntProperty"}; 

這可以在C++ 11來完成,但是你也可以在構造函數初始化列表初始化,

// Header 
class propertyHolder { 
public: 
    propertyHolder(string s); 
private: 
    property<int> myIntProperty; 
}; 

// Source 
propertyHolder::propertyHolder(string s) : 
    myIntProperty(s) 
{ 
} 
+0

謝謝你解決了這個問題:)。你能解釋一些還是指向我的文檔,在那裏我可以找到以前的案例出了什麼問題? – Harish

+0

@Harish [爲什麼C++ 11內部初始化程序不能使用圓括號?](http://stackoverflow.com/q/24836526/3953764) –

+0

這將導致「[最煩人的解析](https:// en.wikipedia.org/wiki/Most_vexing_parse)」。 – aslg

相關問題