繁体   English   中英

预期在';'之前的主要表达式 代币

[英]expected primary-expression before ‘;’ token

我有这个课:

#pragma once

#include <iostream>

namespace Ispit
{
    template <class T>
    class Value
    {
        template <class Y>
        friend std::ostream& operator<<(std::ostream&, const Value<Y>&) noexcept;
        public:
            Value() noexcept;
            Value(T val) noexcept; //{ podatak = val;}
            Value& operator()();
            bool operator<(const Value&);
            virtual void print(std::ostream&) const noexcept;
            virtual ~Value();
        protected:
            T podatak;
    };

    template <class T>
    std::ostream& operator<<(std::ostream& out, const Value<T>& val) noexcept
    {
        val.print(out);
        return out;
    }

    template <class T>
    Value<T>::Value() noexcept : podatak(T()) {}

    template <class T>
    Value<T>::Value(T val) noexcept //: podatak(T) {}
    {
        podatak = T; // this where the error occurs
    }

    template <class T>
    Value<T>& Value<T>::operator()()
    {
        return podatak;
    }
}

编译时出现此错误:

expected primary-expression before ‘;’ token

为什么会发生这种情况,我该如何解决?

我尝试在各个地方添加模板字,但没有找到变量规则(不确定这是否是thig)。

即使函数是内联的也不起作用...

编译器gcc 5.2.1

您正在为变量分配类型:

template <class T>
Value<T>::Value(T val) noexcept 
{
    podatak = T; 
}

应该是:

template <class T>
Value<T>::Value(T val) noexcept 
{
    podatak = val; 
}

或更妙的是,使用成员初始化列表:

template <class T>
Value<T>::Value(T val) noexcept : podatak(val) {}

另外,您可以删除默认构造函数,并将其与1参数构造函数组合:

//  Remove this code
//    template <class T>
//    Value<T>::Value() noexcept : podatak(T()) {}

// Combine the above into this
    template <class T>
    Value<T>::Value(T val = T()) noexcept : podatak(val) {}

如果没有给出参数,上面的代码将默认构造T类型,基本上将您的原始默认构造函数组合到1参数构造函数中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM