4

次のコードでは、main() の 'bObj->b()' 行はコンパイルされますが、'cObj->c()' 行は '>' トークンの前にプライマリ式が必要です' というエラーが発生します。これは依存型とは関係ありません。適切な場所に「テンプレート」または「タイプ名」を追加しても役に立ちません。問題が何であるかについてのヒントはありますか?このコードの「実際の」バージョンには、関数「b」の他の多くのテンプレート バージョンと非テンプレート バージョンがあります。問題は 1 つの場所でのみ発生し、他の場所では発生しない可能性がありますが、何が重要な違いであるかを判断できませんでした。

#include <boost/shared_ptr.hpp>

class A {};
class D : public A {};

class B
{
public: 
        template <class T> boost::shared_ptr<T> b() { return boost::shared_ptr<T>(); }
};      

class C
{
public: 
        boost::shared_ptr<A> b() { return boost::shared_ptr<A>(); }
};      

int main(int, char **)
{       
        boost::shared_ptr<C> cObj(new C);
        boost::shared_ptr<B> bObj = boost::dynamic_pointer_cast<B>(cObj);

        bObj->b<D>();
        cObj->b<D>();
}    
4

1 に答える 1

4

Cメンバー関数templateはなく、通常のメンバー関数のみです。したがって、次の呼び出し時にテンプレート引数を指定することはできませんC::b()

cObj->b<D>(); // ERROR!
cObj->b(); // OK

さらに:

このコードの「実際の」バージョンには、関数「b」の他の多くのテンプレート バージョンと非テンプレート バージョンがあります。

次に、提供したコードは、コードの「実際の」バージョンで発生している問題の良い例ではない可能性があります。

問題は 1 つの場所でのみ発生し、他の場所では発生しない可能性がありますが、何が重要な違いであるかを判断できませんでした。

あなたのコードを一番よく知っているのはあなたです。目に見えないものについて推測することはできません。この回答で問題が解決しない場合は、「実際の」コードが行うことのより代表的な例を作成し、おそらくそれをSSCCEに減らす必要があると思います。

于 2013-02-22T20:06:31.963 に答える