0

メインでインスタンス化しても問題はありませんが、別のクラスで同じものをインスタンス化しようとすると問題が発生するテンプレートクラスがあります。誰かがこれの解決策を教えてください

#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|エラー: 文字列定数の前に ',' または '...' が必要です |

ありがとう、ハリッシュ

4

2 に答える 2

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 )
{
}
于 2015-10-04T11:32:21.573 に答える
0

class で field を宣言したかったのpropertyHandlerです。フィールドを宣言して同じ場所で値を代入することはできないため、この構文は機能しません。

それをデルケアして、コンストラクターで初期化できます。

property<int> myIntProperty;

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

または C++11 構文を使用:

property<int> myIntProperty{"name"};

またはそれを静的に宣言すると、次のように宣言されます。

static property<int> myIntProperty;

そしてクラス宣言の後:

property<int> propertyHolder::myIntProperty("name");
于 2015-10-04T11:39:02.973 に答える