2017-11-25 136 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

首先,让我们来重写你的榜样到的东西,是可读的,是更接近于编译,而且我们还打印出“1”或“2” say()知道哪个函数被调用:

#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 ,所以首先,您正在尝试专门A内的B。这是不允许的,所以let't外移动它的A

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"; 
    } 
}; 

接下来,您使用的是相同的模板参数(T)在这两个Bsay()。你不需要重复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