1

2 つのクラスがあります。1 つはテンプレート化され、もう 1 つはテンプレート化されていません。テンプレート化されていないクラス内にテンプレート化されたクラスのインスタンスを作成しようとしていますが、プログラムがコンパイルされません。Visual Studio 2012 を使用していますが、bar.h の次の行に「IntelliSense: 型指定子が必要です」というエラーが表示されます。

Foo<int> foo_complex(99);  

この構文は、クラスの外で使用できます (下記の console.cpp を参照)。クラス内で空のコンストラクターを使用できます。何を与える?Bar 内の Foo に空でないコンストラクターを正しく使用するにはどうすればよいですか?

よろしくお願いします。私はどこでも解決策を探しましたが、空になりました。コード例を以下に示します。わかりやすくするために、クラスの実装はインラインです。

foo.h

#pragma once

template<typename T>
class Foo
{
public:
    Foo();
    Foo(int i);
};

template<typename T>
Foo<T>::Foo()
{
    std::cout << "You created an instance of Foo without a value." << std::endl;
}

template<typename T>
Foo<T>::Foo(int i)
{
    std::cout << "You created an instance of Foo with int " << i << std::endl;
}

bar.h

#pragma once

#include "foo.h"

class Bar
{
private:
    Foo<int> foo_simple;
    Foo<int> foo_complex(99); // Error ~ IntelliSense:expected a type specifier
public:
    Bar(int i);
};

Bar::Bar(int i)
{
    std::cout << "You created an instance of Bar with int " << i << std::endl;
}

コンソール.cpp

#include "stdafx.h"
#include <iostream>
#include <string>
#include "foo.h"
#include "bar.h"

int _tmain(int argc, _TCHAR* argv[])
{
    Foo<int> foo(1);
    Bar bar(2);
    std::string any = "any";

    std::cout << std::endl;
    std::cout << "Press any key to close this window..." << std::endl;
    std::cin >> any; 
    return 0;
}
4

4 に答える 4

1

コンストラクターでメンバー変数を初期化します。

class Bar
{
private:
    Foo<int> foo_complex;
public:
    Bar(int i);
};

Bar::Bar(int i) : foo_complex(99)
{
    std::cout << "You created an instance of Bar with int " << i << std::endl;
}
于 2013-05-09T17:30:58.887 に答える
0

ブレースの初期化を使用する必要があります。

Foo<int> foo_complex{99};

C++11 では、データ メンバーのインライン初期化にブレースまたはイコール初期化子Foo<int>を使用できるため、他の有効な代替手段は次のとおりです (移動構築可能であるため)。

Foo<int> foo_complex = Foo<int>(99);

そして (Foo<int>を受け取る非explicit変換コンストラクタがあるためint):

Foo<int> foo_complex = 99;

もちろん、C++03 と同様にfoo_complex、コンストラクターの初期化リストでデータ メンバーを初期化できます。

于 2013-05-09T17:29:55.493 に答える
-1

これは関数を宣言しようとしています:

Foo<int> foo_complex(99);

パラメータとして型指定子が必要だと言っていると思います。クラス定義ではなく、コンストラクターでこのオブジェクトを構築する必要があります。

于 2013-05-09T17:27:38.287 に答える
-1

オブジェクトをメンバー変数として宣言する場合、オブジェクトを初期化することはできません。含まれているクラス コンストラクターの初期化リストで行う必要があります。

Bar::Bar(int i)
    : foo_complex(99)
{
    // ...
}

コンパイラがC++11 の均一な初期化をサポートするのに十分なほど新しい場合は、それを実行できるはずですが、構文が少し異なります。

Foo<int> foo_complex{99};

括弧の代わりに中括弧に注意してください。

于 2013-05-09T17:28:57.040 に答える