2017-11-25 11 views
1

タイプに応じて関数を呼び出すためのクラスがあります。私はそれをコンパイルしようとしましたが、エラーが発生しました:C2059構文エラー: 'テンプレート'内部クラスのテンプレート関数を呼び出す

class A 
{ 
    call_1() 
{ 
    B<type> b; 
    b.template say(i); 
} 

template<class T> 
    struct B 
    { 
     template <typename T, typename I> 
     T say(I i) { 
      return word; 
     } 
    }; 
    template<> 
    struct B<void> 
    { 
     template <typename T, typename I> 
     void say(I i) { 
      /**/ 
     } 
    }; 
} 

私は間違っていますか?

+0

または別の方法で/の機能を作成することはできますか? – Hait

+0

sytaxは 'b.say (i);'のようになります。そして 'say'は 'template T say(I i){}'のように宣言されるべきです – Rabbid76

答えて

1

まずは、読み取り可能であるとコンパイル可能であることに近いものにあなたの例を書き換えて、我々はまた、呼び出された機能を知るためにsay()で「1」または「2」を印刷してみましょう:

#include <iostream> 
using type = int; 

class A { 
    void call_1() { 
     B<type> b; 
     int i = 0; 
     b.template say(i); 
    } 

    template<class T> 
    struct B 
    { 
     template <typename T, typename I> 
     T say(I i) { 
      std::cout << "1\n"; 
      return T(); 
     } 
    }; 

    template<> 
    struct B<void> 
    { 
     template <typename T, typename I> 
     void say(I i) { 
      std::cout << "2\n"; 
     } 
    }; 
}; 

OKまず、BAの内側に特化しようとしています。これは許可されていませんので、Aの外に移動しlet't:アップ

using type = int; 

class A { 
    void call_1() { 
     B<type> b; 
     int i = 0; 
     b.template say(i); 
    } 

    template<class T> 
    struct B 
    { 
     template <typename T, typename I> 
     T say(I i) { 
      std::cout << "1\n"; 
      return T(); 
     } 
    }; 
}; 

template<> 
struct A::B<void> 
{ 
    template <typename T, typename I> 
    void say(I i) { 
     std::cout << "2\n"; 
    } 
}; 

次に、あなたがBsay()の両方で同じテンプレートパラメータ(T)を使用しています。あなたはTを繰り返し、それでは、それを削除できるようにする必要はありません。

using type = int; 

class A { 
    void call_1() { 
     B<type> b; 
     int i = 0; 
     b.template say(i); 
    } 

    template<class T> 
    struct B 
    { 
     template <typename I> 
     T say(I i) { 
      std::cout << "1\n"; 
      return T(); 
     } 
    }; 
}; 

template<> 
struct A::B<void> 
{ 
    template <typename I> 
    void say(I i) { 
     std::cout << "2\n"; 
    } 
}; 

最後に、call_1()A::Bの専門前に定義することはできませんので、我々はあまりにも外に移動する必要があります。

using type = int; 

class A { 
    void call_1(); 

    template<class T> 
    struct B 
    { 
     template <typename I> 
     T say(I i) { 
      std::cout << "1\n"; 
      return T(); 
     } 
    }; 
}; 

template<> 
struct A::B<void> 
{ 
    template <typename I> 
    void say(I i) { 
     std::cout << "2\n"; 
    } 
}; 

void A::call_1() { 
    B<type> b; 
    int i = 0; 
    b.template say(i); 
} 

この今コンパイルして、あなたが望むことをしなければなりません。 call_1()を呼び出すと、1が印刷されます。あなたはintvoidからtypeを変更する場合:

using type = void; 

それは2を印刷します。

関連する問題