1

class の宣言内で、Densityこれらのメンバー関数を作成しました。

class Density {
public:
    template <typename Container>
    void printStream (Container<Point>::iterator lo, Container<Point>::iterator hi);
......
};

cpp ファイルで:

template <typename Container>
void Density::printStream (Container<Point>::iterator lo, Container<Point>::iterator hi)
{
...
}

ただし、コンパイルしようとすると次のエラーが発生します。

src/../include/density.hpp:166:23: error: 'Container' is not a template
src/../include/density.hpp:166:50: error: expected unqualified-id before 'lo'
src/../include/density.hpp:166:50: error: expected ')' before 'lo'
src/../include/density.hpp:166:50: error: expected initializer before 'lo'
src/density.cpp: In member function 'void Density::startAlgorithm()':
src/density.cpp:291:43: error: 'printStream' was not declared in this scope
src/density.cpp: At global scope:
src/density.cpp:327:28: error: 'Container' is not a template
src/density.cpp:327:55: error: expected unqualified-id before 'lo'
src/density.cpp:327:55: error: expected ')' before 'lo'
src/density.cpp:327:55: error: expected initializer before 'lo'

何を変更すればよいですか?また、なぜ、この問題を理解したいのでしょうか。

4

1 に答える 1

4

注意。コメントしたように、テンプレートを使用することがヘッダー ファイル内のテンプレート定義の可視性に与える影響を認識していない可能性があります。そのためのエントリを紹介させてください:なぜテンプレートはヘッダー ファイルにしか実装できないのですか?


テンプレート テンプレート引数の使用:

template <template <typename...> class Container>
void Density::printStream ()
{
    typename Container<Point>::iterator lo;
    typename Container<Point>::iterator hi;
}

イテレータの引数は推定できないコンテキストであるため、あなたがやろうとしていることは私には不可能に思えます。とにかくコンテナタイプを明示的に指定することになります:

   density_instance.printStream<std::vector>(it1, it2);

ただし、コンテナーの正確なタイプはあまり気にしないので、これは実際には問題ではないことに注意してください。慣用的な方法は次のとおりです。

template <typename It>
    void printStream (It lo, It hi);  

を使って自由に呼び出すことができます

std::vector<int> v { 1,2,3 };
density_instance.printStream(begin(v), end(v));

ただし、イテレータが重要であるため、クラス以外のコンテナでも同様です。

const int a[] = { 1,2,3 };
density_instance.printStream(std::begin(a), std::end(b));
于 2013-06-09T17:08:52.823 に答える