18

重複の可能性:
「template」および「typename」キーワードをどこに、なぜ配置する必要があるのですか?

コードは次のとおりです。

template<typename T>
class base
{
public:
    virtual ~base();

    template<typename F>
    void foo()
    {
        std::cout << "base::foo<F>()" << std::endl;
    }
};

template<typename T>
class derived : public base<T>
{
public:
    void bar()
    {
        this->foo<int>(); // Compile error
    } 
};

そして、実行時:

derived<bool> d;
d.bar();

次のエラーが表示されます。

error: expected primary-expression before ‘int’
error: expected ‘;’ before ‘int’

非依存の名前と 2 フェーズのルックアップを認識しています。しかし、関数自体がテンプレート関数 (foo<>()コード内の関数) である場合、すべての回避策を試しても失敗しました。

4

2 に答える 2

32

footypenameは依存名であるため、 ortemplateキーワードを使用して別の方法で指定しない限り、第1フェーズのルックアップでは変数であると見なされます。この場合、次のようにします。

this->template foo<int>();

すべての厄介な詳細が必要な場合は、この質問を参照してください。

于 2012-02-15T08:15:28.033 に答える
12

あなたはこのようにそれをするべきです:

template<typename T>
class derived : public base<T>
{
public:
    void bar()
    {
        base<T>::template foo<int>();
    } 
};

これが完全にコンパイル可能な例です:

#include <iostream>

template<typename T>
class base
{
public:
    virtual ~base(){}

    template<typename F>
    void foo()
    {
        std::cout << "base::foo<F>()" << std::endl;
    }
};

template<typename T>
class derived : public base<T>
{
public:

    void bar()
    {
        base<T>::template foo<int>(); // Compile error
    }
};

int main()
{
  derived< int > a;
  a.bar();
}
于 2012-02-15T08:15:16.707 に答える