1

我正在尝试继承一个结构以添加一个 += 运算符。

这段代码看起来是对的,但它无法编译,我从编译器得到的只是:

语法错误:在 '<' 之前缺少 ','
请参阅对正在编译的类模板实例化 'Test' 的引用

struct plus_equals
{
    template<typename T, typename S>
    struct operator_type
    {
        S& operator+=(const T &other)
        {
            S* super = (S*)this;
            super->value += other;
            return *super;
        }
    };
};

template<typename T, typename OP>
struct Test : OP::operator_type<T, Test<T, OP>>   // error on this line
{
    T value;
    Test(T val) : value(val){}
};

int main(int argc, char *argv[])
{
    Test<int, plus_equals> test(123);
    test += 456;
    cout << test.value << endl;
    return 0;
}

我很困惑为什么下面的代码会编译,但上面的代码不会。

template<typename T>
struct Something
{
    T GetT() { return T(); }
};

class Test : public Something<Test>
{
    //...
};
4

2 回答 2

1

您的代码的问题在于它operator_type是一个模板,但编译器不知道将其视为一个模板,除非您将模板关键字放在它前面。

#include <iostream>                                                                
using namespace std;                                                               
struct plus_equals                                                                 
{                                                                                  
    template<typename T, typename S>                                               
    struct operator_type                                                           
    {                                                                              
        S& operator+=(const T &other)                                              
        {                                                                          
            S* super = (S*)this;                                                   
            super->value += other;                                                 
            return *super;                                                         
        }                                                                          
    };                                                                             
};                                                                                 

template<typename T, typename OP>                                                  
struct Test : OP:: template operator_type<T, Test<T, OP>>   // error on this line
{                                                                                  
    T value;                                                                       
    Test(T val) : value(val){}                                                     
};                                                                                 

int main(int argc, char *argv[])                                                   
{                                                                                  
    Test<int, plus_equals> test(123);                                              
    test += 456;                                                                   
    cout << test.value << endl;                                                    
    return 0;                                                                      
}   

这个问题解释了如何完全解决依赖模板和类型名,以防问题再次出现。我还建议升级您的编译器,因为 clang 3.3 基本上会为您提供错误。这是我得到的不错的干净错误。 在此处输入图像描述

这是一个简单的问题解决方案

#include <iostream>                                                                
using namespace std;                                                               
template<typename T, typename Orig>                                                
struct operator_type                                                               
{                                                                                  
    Orig & operator+=(const T &other)                                              
    {                                                                              
        static_cast<Orig*>(this)->value += other;                                   
        return *static_cast<Orig*>(this);                                           
    }                                                                              
};                                                                                 

template<typename T, template <class,class> class OP>                               
struct Test : OP<T,Test<T,OP>>   // error on this line                             
{                                                                                  
    T value;                                                                       
    Test(T val) : value(val){}                                                     
};                                                                                 

int main() {                                                                       
    Test<int,operator_type> t(10);                                                 
    t += 10;                                                                       
    cout << t.value << endl;                                                       
    return 0;                                                                      
}
于 2013-11-10T02:18:37.123 回答
1

如果您使用template关键字进行消歧,它将编译。

struct Test : OP::template operator_type<T, Test<T, OP> >

为什么有必要在这里介绍:模板的模板成员的歧义模板关键字:确切的时间?

于 2013-11-10T02:18:55.967 回答