1

下面的代码有什么问题?最新版本的 g++ 和 clang 都报错。我确定我在这里遗漏了一些基本的东西。

#include <iostream>

struct Z
{
  static const int mysize = 10; 
};

Z f2();

int main()
{
    std::cout << f2()::mysize << std::endl;
}

这里的动机是能够使用以下代码使用模板找出数组的大小。我知道有很多方法,但偶然发现了这个想法。

template<int N> struct S
{
    enum { mysize = N };
};

template<class T, int N> S<N> f(T (&)[N]);

int main()
{
    char buf[10];
    std::cout << f(buf)::mysize << std::endl;
}
4

4 回答 4

4

f2()返回一个值,而不是类型。您需要.在返回值上使用运算符而不是::

运算符要求在::左侧命名类型,同时.允许命名值。您的表达式f2()没有命名类型,因此它不能与::.

作为旁注,在问题中提供更多细节,我们可能能够解决您的实际问题。

于 2013-01-22T14:43:56.510 回答
0

您的程序包含两个错误:

  1. 您正在使用::运算符来访问对象的成员。使用operator .("dot") 代替;
  2. 您声明函数f2()并调用它而不定义它(这会给您一个链接器错误)。

此外,由于static成员变量在类的所有实例之间共享(Z在这种情况下),您不需要对象来访问它;

以下是修复程序的方法:

#include <iostream>

struct Z
{
    static const int mysize = 10;
};

Z f2() { return Z(); }

int main()
{
    // Don't need an object to access a static variable...
    std::cout << Z::mysize << std::endl;

    // ...but if you really want to, do it this way...
    std::cout << f2().mysize << std::endl;
}
于 2013-01-22T14:50:33.093 回答
0

为什么不使用这种方式通过模板找出数组的大小:

#include <iostream>

template<int N> struct S
{
    enum { mysize = N };
};

template<class T, int N> int f1(T (&)[N])
{
        return N;
}

int main()
{
    char buf[10];
    std::cout << f1(buf) << std::endl;

}

而这个更接近您的变体:

template<class T, int N> S<N> f(T (&)[N])
{
        S<N> foo;
        return foo;
}


int main()
{
    char buf[10];
    std::cout << f(buf).mysize << std::endl;
}

无论如何,您将需要返回一个对象f并访问它的成员 by .,而不是 by ::。但是第二个变体更可能会更慢,因为第一个变体是完全编译时的,但是在第二个变体中,编译器可能会错过优化并且不会优化运行时创建的foo.

于 2013-01-22T15:05:49.830 回答
-1

我认为您需要const int Z::mysize;在类声明之后添加。

于 2013-01-22T14:46:20.673 回答